У меня есть код ниже, но по какой-то причине он пишет только первую строку для автомобиля и игнорирует каждый автомобиль после.python - не печатать дополнительные строки от json
Редактировать - Я попытался положить print field
в строку после for field in required_fields:
и по какой-то причине он отображает поле только при разборе первой строки. Каждая дополнительная строка возвращает []
для каждого поля.
Что я вижу в CSV-файл является заголовок и одна строка, а затем ,,,,
import csv
import json
car_list = [
{
"Year": 1997,
"Make": "Ford",
"Model": "E350",
"Description": "ac, abs, moon",
"Price": 3000
},
{
"Year": 1999,
"Make": "Chevy",
"Model": "Venture \"Extended Edition\"",
"Price": 4900
},
{
"Year": 1999,
"Model": "Venture \"Extended Edition, Very Large\"",
"Description": "",
"Price": 5000
},
{
"Year": 1996,
"Make": "Jeep",
"Model": "Grand Cherokee",
"Description": "MUST SELL!air, moon roof, loaded",
"Price": 4799
}
]
def _get_attr(dict_, attrs):
try:
src = attrs[:]
root = attrs.pop(0)
node = dict_[root]
null = object()
for i, attr in enumerate(attrs[:]):
try:
node = node.get(attr, null)
except AttributeError:
node = null
if node is null:
# i+2 pop and last element
raise ValueError("%s not present (level %s)" % (attr, '->'.join(src[: i+2])))
return node
except KeyError:
raise ValueError("%s not present" % root)
required_fields = [
['Year'],
['Make'],
['Model'],
['Description'],
['Price']
]
f = csv.writer(open('test.csv', 'wb+'))
f.writerow(['Year',
'Make',
'Model',
'Description',
'Price'])
for car in car_list:
row_values = []
for field in required_fields:
try:
row_values.append(_get_attr(car, field))
except:
row_values.append('')
f.writerow(row_values)
Поскольку 'attrs.pop (0)' удаляет ваше 'поле' из' required_fields'. Списки передаются по ссылке, а не по значению. –
ах ок. так как я могу получить его для возврата к исходным 'required_fields' в каждом цикле? – whoisearth