问题 使用Python(空闲)将JSON转换为CSV


我有一个纬度/经度的JSON文件,我想要转换为CSV文件。我想用Python做到这一点。我已阅读/尝试了所有其他stackoverflow和谷歌搜索结果的建议。我已经设法创建了CSV并包含标题,但除此之外,愚蠢的东西开始发生。到目前为止,这是我的代码的工作部分:

import json, csv

x="""[
    {"longitude":"-73.689070","latitude":"40.718000"},
    {"longitude":"-73.688400","latitude":"40.715990"},
    {"longitude":"-73.688340","latitude":"40.715790"},
    {"longitude":"-73.688370","latitude":"40.715500"},
    {"longitude":"-73.688490","latitude":"40.715030"},
    {"longitude":"-73.688810","latitude":"40.714370"},
    {"longitude":"-73.688980","latitude":"40.714080"},
    {"longitude":"-73.689350","latitude":"40.713390"},
    {"longitude":"-73.689530","latitude":"40.712800"},
    {"longitude":"-73.689740","latitude":"40.712050"},
    {"longitude":"-73.689820","latitude":"40.711810"},
    {"longitude":"-73.689930","latitude":"40.711380"},
    {"longitude":"-73.690110","latitude":"40.710710"}
]"""

x = json.loads(x)

f = csv.writer(open("test.csv", "wb+"))

f.writerow(["longitude", "latitude"])

它在哪里崩溃(“?”的意思是我不知道该放在那里。我已经尝试了各种各样的组合,我在寻找答案时发现了这些组合):

for ? in ?:
    f.writerow([?[?],?[?]])

我从答案中得到了上述内容 这个问题 通过 小鱼。我可以看到我们的JSON示例略有不同,我认为这与我无法使其工作的原因有关...

任何帮助将不胜感激,如果需要,我很乐意提供澄清。仅供参考,我是Python的新手,所以如果您要使用行话,请尽可能清楚地解释。谢谢! (P.S.不确定是否重要,但我使用的是IDLE)。


3255
2017-12-12 20:56


起源



答案:


我会用一个 csv.DictWriter因为你正在处理dicts,这正是如此 DictWriter 是为了。

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


编辑:
自从 .writeheader() 方法只在2.7中添加,你可以在旧版本上使用这样的东西:

rows = json.loads(x)
fieldnames = ['longitude', 'latitude']
with open('test.csv', 'wb+') as f:
    dict_writer = csv.DictWriter(f, fieldnames=fieldnames)
    dict_writer.writerow(dict(zip(fieldnames, fieldnames)))
    dict_writer.writerows(rows)

9
2017-12-12 21:22



嗯...当我尝试时,我收到以下错误: DictWriter instance has no attribute 'writeheader' - Kristen G.
是的,似乎是 writeheader() 方法在2.7中添加,因此早期版本不会有它。您可以将标题写为普通行。 - stranac
对!这样可行! - Kristen G.


答案:


我会用一个 csv.DictWriter因为你正在处理dicts,这正是如此 DictWriter 是为了。

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


编辑:
自从 .writeheader() 方法只在2.7中添加,你可以在旧版本上使用这样的东西:

rows = json.loads(x)
fieldnames = ['longitude', 'latitude']
with open('test.csv', 'wb+') as f:
    dict_writer = csv.DictWriter(f, fieldnames=fieldnames)
    dict_writer.writerow(dict(zip(fieldnames, fieldnames)))
    dict_writer.writerows(rows)

9
2017-12-12 21:22



嗯...当我尝试时,我收到以下错误: DictWriter instance has no attribute 'writeheader' - Kristen G.
是的,似乎是 writeheader() 方法在2.7中添加,因此早期版本不会有它。您可以将标题写为普通行。 - stranac
对!这样可行! - Kristen G.


循环遍历列表,并明确写出字段名称对于这种情况可能是最简单的。

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

2
2017-12-12 21:00



作品!谢谢。 (当然,我纠正了下面提到的拼写错误)。 - Kristen G.


这将帮助您迭代每个项目并将其写入您的csv文件:

import json, csv

x = """[
    {"longitude":"-73.689070","latitide":"40.718000"},
    {"longitude":"-73.688400","latitide":"40.715990"},
    {"longitude":"-73.688340","latitide":"40.715790"},
    {"longitude":"-73.688370","latitide":"40.715500"},
    {"longitude":"-73.688490","latitide":"40.715030"},
    {"longitude":"-73.688810","latitide":"40.714370"},
    {"longitude":"-73.688980","latitide":"40.714080"},
    {"longitude":"-73.689350","latitide":"40.713390"},
    {"longitude":"-73.689530","latitide":"40.712800"},
    {"longitude":"-73.689740","latitide":"40.712050"},
    {"longitude":"-73.689820","latitide":"40.711810"},
    {"longitude":"-73.689930","latitide":"40.711380"},
    {"longitude":"-73.690110","latitide":"40.710710"}
]"""

jsoned = json.loads(x)

with open("test.csv", "wb+") as csv_file:
    csv_writer = csv.writer(csv_file)
    for i in jsoned:
        csv_writer.writerow([i[u'longitude'],
                             i[u'latitide']])

请注意,您在原始帖子中拼错了纬度(latitide)。


1
2017-12-12 21:05



哇。难以置信。我不能相信我没有抓住那个。 Oy公司。谢谢。 - Kristen G.


基于一些答案回答,这就像一个魅力!:

import json, csv

    x="""[
        {"longitude":"-73.689070","latitude":"40.718000"},
        {"longitude":"-73.688400","latitude":"40.715990"},
        {"longitude":"-73.688340","latitude":"40.715790"},
        {"longitude":"-73.688370","latitude":"40.715500"},
        {"longitude":"-73.688490","latitude":"40.715030"},
        {"longitude":"-73.688810","latitude":"40.714370"},
        {"longitude":"-73.688980","latitude":"40.714080"},
        {"longitude":"-73.689350","latitude":"40.713390"},
        {"longitude":"-73.689530","latitude":"40.712800"},
        {"longitude":"-73.689740","latitude":"40.712050"},
        {"longitude":"-73.689820","latitude":"40.711810"},
        {"longitude":"-73.689930","latitude":"40.711380"},
        {"longitude":"-73.690110","latitude":"40.710710"}
    ]"""

    x = json.loads(x)

    f = csv.writer(open("test.csv", "wb+"))

    f.writerow(["longitude", "latitude"])

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

1
2017-12-12 21:20



运用 with open() as x 通常建议使用语法,因为它允许打开文件处理程序在完成后自动关闭。 - hexparrot
好吧,因为我一直在玩这个,我现在可以看到。谢谢! - Kristen G.