Преобразование 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']] )