#python #json #csv #dictionary #python-3.7
#python #json #csv #словарь #python-3.7
Вопрос:
Не удается преобразовать Python dict в таблицу, а затем экспортировать данные в csv.
dict string: {"test_sheet": {"testheader": [{"2018-12-31": {"field1": 8482000000, "field2": 166731000000, "field3": 92128000000}}, {"2018-11-30": {"field1": 7579000000, "field2": 171652000000, "field3": 85967000000}}, {"2018-10-31": {"field1": 8053000000, "field2": 176130000000, "field3": 82718000000}}, {"2018-09-30": {"field1": 8544000000, "field2": 166258000000, "field3": 79239000000}}]}}
Format of table needed:
Report Name Date Field1 Field2 Field3
test_sheet testheader 31.12.2018 8482000000 166731000000 92128000000
test_sheet testheader 30.11.2018 7579000000 171652000000 85967000000
test_sheet testheader 31.10.2018 8053000000 176130000000 82718000000
test_sheet testheader 30.09.2018 8544000000 166258000000 79239000000
Пытаюсь преобразовать dict в csv с помощью read_json
import pandas
data = {"test_sheet": {"testheader": [{"2018-12-31": {"field1": 8482000000, "field2": 166731000000, "field3": 92128000000}}, {"2018-11-30": {"field1": 7579000000, "field2": 171652000000, "field3": 85967000000}}, {"2018-10-31": {"field1": 8053000000, "field2": 176130000000, "field3": 82718000000}}, {"2018-09-30": {"field1": 8544000000, "field2": 166258000000, "field3": 79239000000}}]}}
pandas.read_json(json.dumps(data)).to_csv('testfile.csv')
Но после экспорта в csv все данные сохраняются в первой строке.
Новые подробные входные данные :
{"test_sheet": {"testheader": [ {"2018-12-31": {"field1": 8482000000, "field2": 166731000000, "field3": 92128000000}}, {"2018-11-30": {"field1": 7579000000, "field2": 171652000000, "field3": 85967000000, "field4": 6679000000, "field5": 159000000}}, {"2018-10-31": {"field1": 8053000000, "field2": 176130000000, "field3": 82718000000, "field4": 1218000000}}, {"2018-09-30": {"field1": 8544000000, "field2": 166258000000, "field3": 79239000000}}], "testheader1": [ {"2018-12-31": {"field1": 8482000000, "field2": 166731000000, "field3": 92128000000, "field4": 124000000}}, {"2018-11-30": {"field1": 7579000000, "field2": 171652000000, "field3": 85967000000, "field4": 44367000000, "field5": 582000000}}, {"2018-10-31": {"field1": 8053000000, "field2": 176130000000, "field3": 82718000000, "field4": 132500000, "field5": 15847000, "field6": 1982330000}}, {"2018-09-30": {"field1": 8544000000, "field2": 166258000000, "field3": 79239000000}}]}}
Необходимый формат вывода для этих данных:
Report Name Date FieldName FieldValue
test_sheet testheader 31.12.2018 Field1 8482000000
test_sheet testheader 31.12.2018 Field2 166731000000
test_sheet testheader 31.12.2018 Field3 92128000000
test_sheet testheader 30.11.2018 Field1 7579000000
test_sheet testheader 30.11.2018 Field2 171652000000
test_sheet testheader 30.11.2018 Field3 85967000000
test_sheet testheader 30.11.2018 Field4 6679000000
test_sheet testheader 30.11.2018 Field5 159000000
test_sheet testheader 31.10.2018 Field1 8053000000
test_sheet testheader 31.10.2018 Field2 176130000000
test_sheet testheader 31.10.2018 Field3 82718000000
test_sheet testheader 31.10.2018 Field4 1218000000
test_sheet testheader 30.09.2018 Field1 8544000000
test_sheet testheader 30.09.2018 Field2 166258000000
test_sheet testheader 30.09.2018 Field3 79239000000
test_sheet testheader1 31.12.2018 Field1 8482000000
test_sheet testheader1 31.12.2018 Field2 166731000000
test_sheet testheader1 31.12.2018 Field3 92128000000
test_sheet testheader1 31.12.2018 Field4 124000000
test_sheet testheader1 30.11.2018 Field1 7579000000
test_sheet testheader1 30.11.2018 Field2 171652000000
test_sheet testheader1 30.11.2018 Field3 85967000000
test_sheet testheader1 30.11.2018 Field4 44367000000
test_sheet testheader1 30.11.2018 Field5 582000000
test_sheet testheader1 31.10.2018 Field1 8053000000
test_sheet testheader1 31.10.2018 Field2 176130000000
test_sheet testheader1 31.10.2018 Field3 82718000000
test_sheet testheader1 31.10.2018 Field4 132500000
test_sheet testheader1 31.10.2018 Field5 15847000
test_sheet testheader1 31.10.2018 Field6 1982330000
test_sheet testheader1 30.09.2018 Field1 8544000000
test_sheet testheader1 30.09.2018 Field2 166258000000
test_sheet testheader1 30.09.2018 Field3 79239000000
Ответ №1:
Набор данных слишком пользовательский, чтобы его можно было использовать с какой-либо платформой. Вот способ сделать это:
import csv
data = {"test_sheet": {"testheader": [{"2018-12-31": {"field1": 8482000000, "field2": 166731000000, "field3": 92128000000}}, {"2018-11-30": {"field1": 7579000000, "field2": 171652000000, "field3": 85967000000}}, {"2018-10-31": {"field1": 8053000000, "field2": 176130000000, "field3": 82718000000}}, {"2018-09-30": {"field1": 8544000000, "field2": 166258000000, "field3": 79239000000}}]}}
pf = open("out.csv", "w")
writer = csv.DictWriter(pf, fieldnames=["Report", "Name", "Date", "Field1", "Field2", "Field3"])
writer.writeheader()
for report, report_data in data.items():
for name, name_data in report_data.items():
for date_wrapper in name_data:
date = list(date_wrapper.keys())[0]
date_data = date_wrapper[date]
writer.writerow({
"Report": report,
"Name": name,
"Date": date,
"Field1": date_data['field1'],
"Field2": date_data['field2'],
"Field3": date_data['field3']
})
pf.close()
ОБНОВЛЕНИЕ: Для второй версии:
import csv
data = {"test_sheet": {"testheader": [ {"2018-12-31": {"field1": 8482000000, "field2": 166731000000, "field3": 92128000000}}, {"2018-11-30": {"field1": 7579000000, "field2": 171652000000, "field3": 85967000000, "field4": 6679000000, "field5": 159000000}}, {"2018-10-31": {"field1": 8053000000, "field2": 176130000000, "field3": 82718000000, "field4": 1218000000}}, {"2018-09-30": {"field1": 8544000000, "field2": 166258000000, "field3": 79239000000}}], "testheader1": [ {"2018-12-31": {"field1": 8482000000, "field2": 166731000000, "field3": 92128000000, "field4": 124000000}}, {"2018-11-30": {"field1": 7579000000, "field2": 171652000000, "field3": 85967000000, "field4": 44367000000, "field5": 582000000}}, {"2018-10-31": {"field1": 8053000000, "field2": 176130000000, "field3": 82718000000, "field4": 132500000, "field5": 15847000, "field6": 1982330000}}, {"2018-09-30": {"field1": 8544000000, "field2": 166258000000, "field3": 79239000000}}]}}
pf = open("out.csv", "w")
writer = csv.DictWriter(pf, fieldnames=["Report", "Name", "Date", "FieldName", "FieldValue"])
writer.writeheader()
for report, report_data in data.items():
for name, name_data in report_data.items():
for date_wrapper in name_data:
date = list(date_wrapper.keys())[0]
date_data = date_wrapper[date]
for field_name, field_value in date_data.items():
writer.writerow({
"Report": report,
"Name": name,
"Date": date,
"FieldName": field_name,
"FieldValue": field_value
})
pf.close()
Комментарии:
1. Спасибо, это именно то, что нужно, но в csv-файле пустые строки чередуются со строками данных. Пожалуйста, вы можете помочь это исправить?
2. @Игорь согласно набору данных, который вы указали в своем вопросе, CSV должен содержать непрерывный поток строк. Отличаются ли данные, которые вы передаете скрипту, от тех, которые вы указали в своем вопросе?
3. Данные те же. Я просто скопировал код и заглянул в файл out.
4. Странно, потому что, когда я смотрю на это, я не вижу никаких пустых строк. И у вас не должно быть никаких новых пробелов, потому что я ничего не добавляю в файл после writerow. Я открываю его как текстовый файл, и в строке содержится только одна новая строка. Может быть, попробовать другой CSV-редактор?
5. @Igor, обязательно пометьте ответ как правильный, если это помогло вам. Обычно это помогает другим пользователям stackoverflow идентифицировать себя как экспертов в определенных областях.
Ответ №2:
Ваш формат данных довольно вложенный. CSV не очень хорошо обрабатывает вложенную структуру.
Предоставленный вами код будет работать — при условии, что вы немного предварительно обработаете свои данные. К каждой из строк можно получить доступ следующим образом: data["test_sheet"]["test_header"][i]
Получите доступ к каждой строке следующим образом и добавьте в нее первые 2 столбца.
Комментарии:
1. Спасибо за вашу помощь.