【问题标题】:Convert JSON to CSV using Python (Idle)使用 Python 将 JSON 转换为 CSV(空闲)
【发布时间】:2012-11-30 16:07:36
【问题描述】:

我有一个纬度/经度的 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([?[?],?[?]])

我从little_fishthis question 的回答中得到了以上信息。我可以看到我们的 JSON 示例略有不同,我假设这与我无法让它工作的原因有关......

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

【问题讨论】:

    标签: python json csv python-idle


    【解决方案1】:

    我会使用csv.DictWriter,因为您正在处理字典,而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)
    

    【讨论】:

    • hmm...当我尝试得到以下错误时:DictWriter instance has no attribute 'writeheader'
    • 是啊,好像writeheader()方法是2.7加入的,所以之前的版本是没有的。不过,您可以将标题写为普通行。
    【解决方案2】:

    逐一遍历列表,明确地写出字段名称可能是这种情况下最简单的方法。

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

    【讨论】:

    • 有效!谢谢你。 (当然是在我纠正了下面提到的拼写错误之后)。
    【解决方案3】:

    这将帮助您迭代每个项目并将其写入您的 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)。

    【讨论】:

    • 哇。极好的。我不敢相信我没听懂。哦。谢谢。
    【解决方案4】:

    根据一些回答,这就像一个魅力!:

    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']] )
    

    【讨论】:

    • 通常建议使用with open() as x 语法,因为它允许在您完成后自动关闭打开的文件处理程序。
    • 好的,因为我一直在玩这个,现在我可以看到了。谢谢!
    猜你喜欢
    • 2012-12-01
    • 2018-01-04
    • 2019-02-23
    • 2021-09-01
    • 2021-12-03
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多