使用Python(空闲)将JSON *文件*转换为CSV *文件*

时间:2012-12-13 13:33:01

标签: python json csv arcgis arcpy

这个问题背负着我昨天发布的question。我实际上让我的代码工作正常。我从小开始。我为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']] )

非常感谢任何帮助!!

3 个答案:

答案 0 :(得分:0)

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

您需要添加以下内容:

rows = json.load(openJSONfile)

以后:

dict_writer.writerows(rows)

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

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

答案 1 :(得分: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文件是一个行字典列表(假设它是你在链接问题中嵌入的那个)。

答案 2 :(得分: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'

感谢大家的帮助。