我有一个名为“玩家”的列表,其中包含字典。它看起来像这样:
players = [{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player1', 'bank': 0.06},
{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player2', 'bank': 4.0},
{'dailyWinners': 1, 'dailyFree': 2, 'user': 'Player3', 'bank': 3.1},
{'dailyWinners': 3, 'dailyFree': 2, 'user': 'Player4', 'bank': 0.32}]
长得多,但这是节选。我如何将这个词典列表输出到 Excel 文件,以便按键/值整齐地组织它?
有一种方法可以将字典列表写入 Excel 工作表。首先,确保你有
XlsxWriter package
.
from xlsxwriter import Workbook
players = [{'dailyWinners': 3, 'dailyFree': 2, 'user': 'Player1', 'bank': 0.06},
{'dailyWinners': 3, 'dailyFree': 2, 'user': 'Player2', 'bank': 4.0},
{'dailyWinners': 1, 'dailyFree': 2, 'user': 'Player3', 'bank': 3.1},
{'dailyWinners': 3, 'dailyFree': 2, 'user': 'Player4', 'bank': 0.32}]
ordered_list=["user", "dailyWinners", "dailyFree", "bank"] # List object calls by index, but the dict object calls items randomly
wb=Workbook("New File.xlsx")
ws=wb.add_worksheet("New Sheet") # Or leave it blank. The default name is "Sheet 1"
first_row=0
for header in ordered_list:
col=ordered_list.index(header) # We are keeping order.
ws.write(first_row,col,header) # We have written first row which is the header of worksheet also.
row=1
for player in players:
for _key,_value in player.items():
col=ordered_list.index(_key)
ws.write(row,col,_value)
row+=1 #enter the next row
wb.close()
我尝试了代码,它成功运行了。
使用 Pandas 的解决方案
import pandas as pd
players = [{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player1', 'bank': 0.06},
{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player2', 'bank': 4.0},
{'dailyWinners': 1, 'dailyFreePlayed': 2, 'user': 'Player3', 'bank': 3.1},
{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player4', 'bank': 0.32}]
df = pd.DataFrame.from_dict(players)
print (df)
df.to_excel('players.xlsx')
xlsxwriter
库非常适合创建 .xlsx
文件(最初由 Fatih1923 提到)。
以下代码片段从字典列表生成一个
.xlsx
文件,同时说明order和显示的名称:
import xlsxwriter
# ...
def create_xlsx_file(file_path: str, headers: dict, items: list):
with xlsxwriter.Workbook(file_path) as workbook:
worksheet = workbook.add_worksheet()
worksheet.write_row(row=0, col=0, data=headers.values())
header_keys = list(headers.keys())
for index, item in enumerate(items):
row = map(lambda field_id: item.get(field_id, ''), header_keys)
worksheet.write_row(row=index + 1, col=0, data=row)
用法
headers = {
'bank': 'Money in Bank',
'dailyWinners': 'Daily Winners',
'dailyFree': 'Daily Free',
'user': 'User',
}
players = [
{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player1', 'bank': 0.06},
{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player2', 'bank': 4.0},
{'dailyWinners': 1, 'dailyFree': 2, 'user': 'Player3', 'bank': 3.1},
{'dailyWinners': 3, 'dailyFree': 2, 'user': 'Player4', 'bank': 0.32}
]
create_xlsx_file("my xslx file.xlsx", headers, players)
💡 注意 -
字典代表order 和displayed name。如果您不使用 Python3.6+,请在headers
中使用OrderedDict
,因为headers
中的顺序未保留dict
test.py
from csv import DictWriter
players = [{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player1', 'bank': 0.06},
{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player2', 'bank': 4.0},
{'dailyWinners': 1, 'dailyFree': 2, 'user': 'Player3', 'bank': 3.1},
{'dailyWinners': 3, 'dailyFree': 2, 'user': 'Player4', 'bank': 0.32}]
with open('spreadsheet.csv','w') as outfile:
writer = DictWriter(outfile, ('dailyWinners','dailyFreePlayed','dailyFree','user','bank'))
writer.writeheader()
writer.writerows(players)
奔跑
python test.py
然后在 Excel 中打开生成的
spreadsheet.csv
文件。
注意:我运行的是 Linux,因此我无法使用 Microsoft Excel 对此进行测试。这在 LibreOffice Calc 中有效,并给出一个电子表格,其中键是列名,值在相应的列下。
data = { "ORCF": { "n": 32, "age": 38.5, "age_std": 6.7, "sex": {"male": 18, "female": 14}, "side": { “左”:17,“右”:15},“BMI”:24.7,“BMI_std”:3.1,“time_from_injury_to_surgery”:4.2,“time_from_injury_to_surgery_std”:1.6,“位移”:5.5,“displacement_std”:1.4,“ fracture_classification": {"OTA_34_A1": 20, "OTA_34_A2": 12}, }, "ORTF": { "n": 31, "age": 39.8, "age_std": 7.3, "sex": {"male" :17,“女性”:14},“侧”:{“左”:15,“右”:16},“BMI”:24.3,“BMI_std”:3.5,“time_from_injury_to_surgery”:4.0,“time_from_injury_to_surgery_std”: 1.5,“位移”:5.4,“displacement_std”:1.5,“fracture_classification”:{“OTA_34_A1”:19,“OTA_34_A2”:12},},}