#python #json #csv
#python #json #csv
Вопрос:
В python у меня есть сложная иерархия объектов, состоящая из списков и словарей. Я хочу изложить все это в формате CSV или каком-либо другом формате базы данных. Любые ответы на Python или Javascript очень ценятся.
Я понимаю, что один CSV-файл (или таблица) может представлять только один «уровень» объекта в моей иерархии, поэтому для решения потребуется создать несколько файлов.
Вот пример:
{
"Person" : [{"name":"Greg","age":"35","car":["honda civic","ford focus"]},
{"name":"Steve","age":"28", "car":["mazda 323", "toyota camry"]}]
}
стало бы
Person.csv:
id,name,age
1,Greg,35
2,Steve,28
car.csv:
id,Person_id,value
1,1,honda civic
2,1,ford focus
3,2,mazda 323
4,2,toyota camry
В принципе, единственное, что здесь происходит интересного, это присвоение новых идентификаторов, чтобы строки в таблицах могли быть связаны.
Приветствую, Дэйв
Ответ №1:
попробуйте что-то вроде этого.
json_dict = {
"Person" : [{"name":"Greg","age":"35","car":["honda civic","ford focus"]},
{"name":"Steve","age":"28", "car":["mazda 323", "toyota camry"]}]
}
for entity in json_dict:
csv_file = open('%s.csv' % entity, 'wb')
headers = a[entity][0].keys()
csv_writer = csv.DictWriter(csv_file, headers)
map(csv_writer.writerow, json_dict[entity])
csv_file.close()
# Теперь у вас есть файл json в csv, для форматирования вы можете использовать awk;
awk -F , '{print NR ", " $2 ", " $3 }' Person.csv > person.csv
…
Ответ №2:
присвоение новых идентификаторов, чтобы строки в таблицах могли быть связаны.
Как в:
-
Создайте первичный ключ (PK) для каждой строки.
-
Создайте связь внешнего ключа (FK) между автомобилем и человеком. Похоже, что Car имеет «зависимые» отношения с Person.
Шаг 1. Используйте enumerate
для ваших объектов JSON. Это даст вам удобный ПК для каждого Человека.
Шаг 2. Используйте удобный PK для каждого человека в качестве FK для каждого автомобиля, который вы создаете.
Единственное, что неприятно, это присвоение PK автомобилям, поскольку нет удобного способа использовать enumerate
в вашей конкретной структуре данных. Для этого вы должны использовать старый добрый счетчик.
Ответ №3:
import json
import csv
temp = json.load(open('filename.json','r'))
output =[]
for each in temp:
row = {}
row['field1'] =each['field1']
row['field2'] = each['field2']
output.append(row)
file = open( "filename_destination.csv", "w")
fileWriter = csv.writer(file , delimiter=",",quotechar='"', quoting=csv.QUOTE_MINIMAL)
Header = ['field1','field2']
fileWriter.writerow(Header)
for x in output:
te = [x['field1'],x['field2']]
fileWriter.writerow(te)
file.close()
Ответ №4:
Я только что выпустил модуль, который упрощает этот процесс в Node.js
var jsonexport = require('jsonexport');
var contacts = [{
name: 'Bob',
lastname: 'Smith',
family: {
name: 'Peter',
type: 'Father'
}
},{
name: 'James',
lastname: 'David',
family:{
name: 'Julie',
type: 'Mother'
}
},{
name: 'Robert',
lastname: 'Miller',
family: null,
location: [1231,3214,4214]
},{
name: 'David',
lastname: 'Martin',
nickname: 'dmartin'
}];
jsonexport(contacts,function(err, csv){
if(err) return console.log(err);
console.log(csv);
});