Я хочу преобразовать файл TSV, который у меня есть, в формат JSON для сопоставления (карты Google Fusion Maps не поддерживают сопоставление нескольких объектов в одном месте, поэтому я конвертирую его в формат JSON, чтобы попробовать Mapbox). Вот мой файл TSV, если вам интересно:
https://github.com/yongcho822/Movies-in-the-park/blob/master/MovieParksGeocodeTest.tsv
А вот мой соответствующий код на Python:
import json
import csv
def create_map(datafile):
geo_map = {"type":"FeatureCollection"}
item_list = []
with open(datafile, 'r') as tsvfile:
reader = csv.DictReader(tsvfile, delimiter = '\t')
for i, line in enumerate(reader):
data = {}
data['type'] = 'Feature'
data['id'] = i
data['properties']={'title': line['Movie Title'],
'description': line['Amenities'],
'date': line['Date']}
data['name'] = {line['Location']}
data['geometry'] = {'type':'Point',
'coordinates':(line['Lat'], line['Lng'])}
item_list.append(data)
#print item_list
for point in item_list:
geo_map.setdefault('features', []).append(point)
print 'CHECKPOINT'
with open("thedamngeojson.geojson", 'w') as f:
f.write(json.dumps(geo_map))
create_map('MovieParksGeocodeTest.tsv')
Это выдает мне ошибку в конце (после того, как он печатает CHECKPOINT), говоря
TypeError: set (['Edgebrook Park, Chicago']) не поддерживает сериализацию JSON
Я полагаю, что последние две строки - это ошибка ... но что не так и как ее исправить ??
1 ответ
JSON разработан как очень простой и очень переносимый формат; единственные типы значений, которые он понимает, - это строки, числа, логические значения, null (например, Python None
), object
(например, Python dict
) и array
(например, Python list
).
Но по крайней мере одно из значений в вашем словаре - set
:
data['name'] = {line['Location']}
Поскольку JSON не имеет типа set
, вы получите сообщение об ошибке set … is not JSON serializable
.
Если вам на самом деле не нужно , чтобы это был set
вместо list
(чего вы, вероятно, не знаете - если он действительно когда-либо имеет только один элемент, кого это волнует какой это тип коллекции?), простой ответ - изменить его на list
:
data['name'] = [line['Location']]
(На самом деле, даже когда вам действительно нужно, чтобы это был набор во время обработки, вам обычно не нужно, чтобы он был набором во время хранения / обмена. Если потребителю вашего файла необходимо его использовать в комплекте, его всегда можно преобразовать обратно позже.)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.