0

这个问题搭载了我昨天发布的一个问题。实际上,我的代码可以正常工作。我从小处着手。我为 Python 代码之外的多个 JSON 文件切换了Python 代码的 JSON 。我实际上让它工作得很好。然后发生了某种灾难,我的代码丢失了。

我花了几个小时试图重新创建它无济于事。我实际上正在使用 arcpy(ArcGIS 的 Python 模块),因为稍后我将使用它来执行一些空间分析,但我认为您不需要了解太多关于 arcpy 的知识来帮助我完成这部分(我不认为,但它可能会有所帮助)。

这是我最近尝试的一个版本,但它不起作用。我将我的实际路径切换为“路径名”。实际上,直到我尝试填充 CSV 中的行(它们是纬度和经度值。它成功地在 CSV 文件中写入纬度/经度标题)之前,我已经完成了所有工作。所以显然下面的任何东西都dict_writer.writerows(openJSONfile)不起作用:

import json, csv, arcpy
from arcpy import env

arcpy.env.workspace = r"C:\GIS\1GIS_DATA\Pathname"

workspaces = arcpy.ListWorkspaces("*", "Folder")
for workspace in workspaces:

    arcpy.env.workspace = workspace
    JSONfiles = arcpy.ListFiles("*.json")

    for JSONfile in JSONfiles:

        descJSONfile = arcpy.Describe(JSONfile)
        JSONfileName = descJSONfile.baseName

        openJSONfile = open(JSONfile, "wb+")
        print "JSON file is open"

        fieldnames = ['longitude', 'latitude']
        with open(JSONfileName+"test.csv", "wb+") as f:
            dict_writer = csv.DictWriter(f, fieldnames=fieldnames)
            dict_writer.writerow(dict(zip(fieldnames, fieldnames)))
            dict_writer.writerows(openJSONfile)

        #Do I have to open the CSV files? Aren't they already open?
        #openCSVfile = open(CSVfile, "r+")

    for row in openJSONfile:
         f.writerow( [row['longitude'], row['latitude']] )

任何帮助是极大的赞赏!!

4

3 回答 3

0

您实际上并未加载 JSON 文件。
您正在尝试从打开的文件中写入行,而不是从 json 中写入行。

您将需要添加如下内容:

rows = json.load(openJSONfile)

然后:

dict_writer.writerows(rows)

你应该删除最后两行,因为所有的 csv 写入都是在你到达它们之前完成的,并且它们在循环之外,所以它们只会对最后一个文件起作用(它们不写任何东西,因为那里此时文件中没有任何行)。

另外,我看到您正在使用with open...打开 csv 文件,而不是 json 文件。
您应该始终使用它,而不是open()不使用该with语句。

于 2012-12-13T13:49:48.697 回答
0

我不能说我确定出了什么问题,但是将所有 .JSON 文件与我的代码放在同一个文件夹中(并适当地更改我的代码)是可行的。我将不得不继续调查为什么在尝试读取其他文件夹时,它给了我错误:

IOError: [Errno 2] No such file or directory:

现在,以下代码可以工作:)

import json, csv, arcpy, os
from arcpy import env

arcpy.env.workspace = r"C:\GIS\1GIS_DATA\MyFolder"

JSONfiles = arcpy.ListFiles("*.json")
print JSONfiles

for JSONfile in JSONfiles:
    print "Current JSON file is: " + JSONfile

    descJSONfile = arcpy.Describe(JSONfile)
    JSONfileName = descJSONfile.baseName

    with open(JSONfile, "rb") as openJSONfile:
        rows = json.load(openJSONfile)      
        print "JSON file is loaded"

    fieldnames = ['longitude', 'latitude']
    with open(JSONfileName+"test.csv", "wb") as f:
        dict_writer = csv.DictWriter(f, fieldnames = fieldnames)
        dict_writer.writerow(dict(zip(fieldnames, fieldnames)))
        dict_writer.writerows(rows)
        print "CSVs are Populated with headers and rows from JSON file.", '\n'

感谢大家的帮助。

于 2012-12-13T16:23:52.097 回答
0

你应该使用一个csv.DictWriter对象来做所有事情。这是与您的代码类似的东西,因为我没有它,所以删除了所有 Arc 东西,这在我测试时有效:

import json, csv

JSONfiles = ['sample.json']

for JSONfile in JSONfiles:

    with open(JSONfile, "rb") as openJSONfile:
        rows = json.load(openJSONfile)

    fieldnames = ['longitude', 'latitude']
    with open(JSONfile+"test.csv", "wb") as f:
        dict_writer = csv.DictWriter(f, fieldnames=fieldnames)
        dict_writer.writeheader()
        dict_writer.writerows(rows)

没有必要写出每一行,因为您的 json 文件是行字典列表(假设它是您嵌入链接问题的内容)。

于 2012-12-13T14:16:41.363 回答