将嵌套字典列表写入 python 中的 excel 文件
Write list of nested dictionaries to excel file in python
我有一个嵌套字典列表,如下所示:
[{'posts': {'item_1': 1,
'item_2': 8,
'item_3': 105,
'item_4': 324,
'item_5': 313, }},
{'edits': {'item_1': 1,
'item_2': 8,
'item_3': 61,
'item_4': 178,
'item_5': 163}},
{'views': {'item_1': 2345,
'item_2': 330649,
'item_3': 12920402,
'item_4': 46199102,
'item_5': 43094955}}]
我想以这种格式将其写入 excel 文件:
+--------+-------+-------+-----------+
| | posts | edits | views |
+--------+-------+-------+-----------+
| item_1 | 1 | 1 | 2345 |
| item_2 | 8 | 8 | 330649 |
| item_3 | 105 | 61 | 12920402 |
| item_4 | 324 | 178 | 46199102 |
| item_5 | 313 | 163 | 430949955 |
+--------+-------+-------+-----------+
我正在使用 xlsxwriter
库并尝试以下和以下变体但没有成功:
for item in data:
for col_name, data in item.iteritems():
col += 1
worksheet.write(row, col, col_name)
for row_name, row_data in data.iteritems():
col += 1
worksheet.write(row, col, row_name)
worksheet.write(row + 1, col, row_data)
我想知道重新处理我的嵌套字典对象是否有意义,或者是否可以以当前形式写入 excel?
当我说没有多大成功时,我的意思是,我可以让它写入某些东西到 excel 文件,比如列名或行或数据,但我无法让它写入如上图所示。我没有收到错误,我怀疑我只是不知道如何正确解压这个对象以循环遍历它。在上面的代码中,第 1 行给出了行名和列名的组合,第 2 行给出了所有值。
我上面代码的输出是:
+--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
| | posts | item_4 | item_5 | item_2 | item_3 | item_1 | edits | item_4 | item_5 | item_2 | item_3 | item_1 | views | item_4 | item_5 | item_2 | item_3 | item_1 |
+--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
| | | 324 | 313 | 8 | 105 | 1 | | 178 | 163 | 8 | 61 | 1 | | 46199102 | 43094955 | 330649 | 12920402 | 2345 |
+--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
作为替代方案,这可以使用 csv
解决,如下所示:
import csv
import itertools
nested = [
{'posts': {'item_1': 1, 'item_2': 8, 'item_3': 105, 'item_4': 324, 'item_5': 313,}},
{'edits': {'item_1': 1, 'item_2': 8, 'item_3': 61, 'item_4': 178, 'item_5': 163}},
{'views': {'item_1': 2345, 'item_2': 330649, 'item_3': 12920402, 'item_4': 46199102, 'item_5': 43094955}}]
headings = [d.keys()[0] for d in nested]
entries = [sorted(nested[index][col].items()) for index, col in enumerate(headings)]
with open('output.csv', 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['items'] + headings)
for cols in itertools.izip_longest(*entries, fillvalue=['<n/a>']*len(entries[0])):
csv_output.writerow([cols[0][0]] + [col[1] for col in cols])
这会给你 output.csv
如下:
items,posts,edits,views
item_1,1,1,2345
item_2,8,8,330649
item_3,105,61,12920402
item_4,324,178,46199102
item_5,313,163,43094955
目前你有一个 dict posts
、edits
和 views
,每个都键控到你的 "items",似乎是多余的。
或者,创建一个键控到您的 "items" 的字典,并将每个项目的 值 设为 posts
、[=13] 的字典=], views
, 喜欢:
items = {}
items = {{'item_1': {'posts':1, 'edits':0, 'views':2345}
{'item_2': {'posts':2, 'edits':8, 'views':330649}}
这样你可以简单地参考items['item_2']['edits']
(应该产生8)或items['item_1']['views']
(应该产生2345), 等等
在你的情况下,则类似于:
# write the headers -- this could be refined
row = 0
worksheet.write(0, 1, 'posts')
worksheet.write(0, 2, 'edits')
worksheet.write(0, 3, 'views')
# write the data:
for itm in items:
row += 1
worksheet.write(row, 0, itm)
for col, prop in enmumerate(items[itm]):
worksheet.write(row, col+1, prop)
import pandas as pd
data = [{'posts': {'item_1': 1,
'item_2': 8,
'item_3': 105,
'item_4': 324,
'item_5': 313, }
},
{'edits': {'item_1': 1,
'item_2': 8,
'item_3': 61,
'item_4': 178,
'item_5': 163}
},
{'views': {'item_1': 2345,
'item_2': 330649,
'item_3': 12920402,
'item_4': 46199102,
'item_5': 43094955}
}]
final_df = pd.DataFrame()
for id in range(0,len(data)):
df = pd.DataFrame.from_dict(data[id])
final_df = pd.concat([final_df, df], axis=1)
print (final_df)
final_df.to_excel('data.xlsx')
我有一个嵌套字典列表,如下所示:
[{'posts': {'item_1': 1,
'item_2': 8,
'item_3': 105,
'item_4': 324,
'item_5': 313, }},
{'edits': {'item_1': 1,
'item_2': 8,
'item_3': 61,
'item_4': 178,
'item_5': 163}},
{'views': {'item_1': 2345,
'item_2': 330649,
'item_3': 12920402,
'item_4': 46199102,
'item_5': 43094955}}]
我想以这种格式将其写入 excel 文件:
+--------+-------+-------+-----------+
| | posts | edits | views |
+--------+-------+-------+-----------+
| item_1 | 1 | 1 | 2345 |
| item_2 | 8 | 8 | 330649 |
| item_3 | 105 | 61 | 12920402 |
| item_4 | 324 | 178 | 46199102 |
| item_5 | 313 | 163 | 430949955 |
+--------+-------+-------+-----------+
我正在使用 xlsxwriter
库并尝试以下和以下变体但没有成功:
for item in data:
for col_name, data in item.iteritems():
col += 1
worksheet.write(row, col, col_name)
for row_name, row_data in data.iteritems():
col += 1
worksheet.write(row, col, row_name)
worksheet.write(row + 1, col, row_data)
我想知道重新处理我的嵌套字典对象是否有意义,或者是否可以以当前形式写入 excel?
当我说没有多大成功时,我的意思是,我可以让它写入某些东西到 excel 文件,比如列名或行或数据,但我无法让它写入如上图所示。我没有收到错误,我怀疑我只是不知道如何正确解压这个对象以循环遍历它。在上面的代码中,第 1 行给出了行名和列名的组合,第 2 行给出了所有值。
我上面代码的输出是:
+--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
| | posts | item_4 | item_5 | item_2 | item_3 | item_1 | edits | item_4 | item_5 | item_2 | item_3 | item_1 | views | item_4 | item_5 | item_2 | item_3 | item_1 |
+--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
| | | 324 | 313 | 8 | 105 | 1 | | 178 | 163 | 8 | 61 | 1 | | 46199102 | 43094955 | 330649 | 12920402 | 2345 |
+--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
作为替代方案,这可以使用 csv
解决,如下所示:
import csv
import itertools
nested = [
{'posts': {'item_1': 1, 'item_2': 8, 'item_3': 105, 'item_4': 324, 'item_5': 313,}},
{'edits': {'item_1': 1, 'item_2': 8, 'item_3': 61, 'item_4': 178, 'item_5': 163}},
{'views': {'item_1': 2345, 'item_2': 330649, 'item_3': 12920402, 'item_4': 46199102, 'item_5': 43094955}}]
headings = [d.keys()[0] for d in nested]
entries = [sorted(nested[index][col].items()) for index, col in enumerate(headings)]
with open('output.csv', 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['items'] + headings)
for cols in itertools.izip_longest(*entries, fillvalue=['<n/a>']*len(entries[0])):
csv_output.writerow([cols[0][0]] + [col[1] for col in cols])
这会给你 output.csv
如下:
items,posts,edits,views
item_1,1,1,2345
item_2,8,8,330649
item_3,105,61,12920402
item_4,324,178,46199102
item_5,313,163,43094955
目前你有一个 dict posts
、edits
和 views
,每个都键控到你的 "items",似乎是多余的。
或者,创建一个键控到您的 "items" 的字典,并将每个项目的 值 设为 posts
、[=13] 的字典=], views
, 喜欢:
items = {}
items = {{'item_1': {'posts':1, 'edits':0, 'views':2345}
{'item_2': {'posts':2, 'edits':8, 'views':330649}}
这样你可以简单地参考items['item_2']['edits']
(应该产生8)或items['item_1']['views']
(应该产生2345), 等等
在你的情况下,则类似于:
# write the headers -- this could be refined
row = 0
worksheet.write(0, 1, 'posts')
worksheet.write(0, 2, 'edits')
worksheet.write(0, 3, 'views')
# write the data:
for itm in items:
row += 1
worksheet.write(row, 0, itm)
for col, prop in enmumerate(items[itm]):
worksheet.write(row, col+1, prop)
import pandas as pd
data = [{'posts': {'item_1': 1,
'item_2': 8,
'item_3': 105,
'item_4': 324,
'item_5': 313, }
},
{'edits': {'item_1': 1,
'item_2': 8,
'item_3': 61,
'item_4': 178,
'item_5': 163}
},
{'views': {'item_1': 2345,
'item_2': 330649,
'item_3': 12920402,
'item_4': 46199102,
'item_5': 43094955}
}]
final_df = pd.DataFrame()
for id in range(0,len(data)):
df = pd.DataFrame.from_dict(data[id])
final_df = pd.concat([final_df, df], axis=1)
print (final_df)
final_df.to_excel('data.xlsx')