Преобразование JSON в CSV с использованием Python (Idle)

У меня есть файл JSON Latitude/Longitude, который я хочу скрывать в CSV файле. Я хочу сделать это с помощью Python. Я прочитал/попробовал все другие предложения stackoverflow и google results results. Мне удалось получить до 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_fish. Я вижу, что наши примеры JSON немного отличаются друг от друга, и я предполагаю, что это имеет какое-то отношение к тому, почему я не могу заставить его работать...

Любая помощь будет принята с благодарностью, и я буду рад предоставить разъяснения, если это необходимо. FYI, я новичок в Python, поэтому, если вы собираетесь использовать жаргон, пожалуйста, объясните это как можно яснее. Благодарю! (P.S. Не уверен, если это имеет значение, но я использую IDLE).

Ответ 1

Я бы использовал 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)


Edit:
Поскольку метод .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)

Ответ 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']] )