[英]python dictionary with list of tuples to CSV
如何看起來像這樣的python字典:
{
'RCLS1': [(0, 20), (10, 112), (20, 130), (30, 102)],
'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]
}
轉換為具有以下結構的CSV:
RCLS1, 0, 20
RCLS1, 10, 112
.
.
.
RLCS2, 30, 45
我試過這個:
with open(r'E:\data.csv', "wb") as f:
csv.writer(f).writerows((k,) + v for k, v in dct.items())
但是這導致了以下錯誤:
can only concatenate tuple (not "list") to tuple
根據您提供的示例輸入/輸出,您可以遍歷字典的鍵值對,然后遍歷與每個鍵關聯的元組值列表,構建關聯的CSV行字符串,並將其寫入CSV文件,如所以:
dct = {'RCLS1':[(0, 20), (10, 112), (20, 130), (30, 102)], 'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]}
int_to_str = lambda int_value: str(int_value)
with open(r"data.csv", "w") as csv_file:
for key, values in dct.items():
for tuple_value in values:
csv_row = [key] + list(map(int_to_str, list(tuple_value)))
csv_file.write(", ".join(csv_row) + "\n")
data.csv結果:
RCLS2, 0, 16
RCLS2, 10, 53
RCLS2, 20, 96
RCLS2, 30, 45
RCLS1, 0, 20
RCLS1, 10, 112
RCLS1, 20, 130
RCLS1, 30, 102
如果我從你的問題中理解的是正確的,那么你正在嘗試做這樣的事情(不需要使用csv
模塊):
a = {'RCLS1':[(0, 20), (10, 112), (20, 130), (30, 102)], 'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]}
with open('E:\data.csv', 'a+') as f:
for k,v in a.items():
f.write("{0}: {1}\n".format(k,", ".join(", ".join(str(j) for j in k) for k in v)))
輸出(文件中的日期與此輸出類似):
RCLS1: 0, 20, 10, 112, 20, 130, 30, 102
RCLS2: 0, 16, 10, 53, 20, 96, 30, 45
否則,如果您想要成對擁有數據,您可以執行以下操作:
with open('E:\data.csv', 'a+') as f:
for k,v in a.items():
f.write("{0}: {1}\n".format(k, "".join(", ".join(str(k) for k in v))))
輸出:
RCLS1: (0, 20), (10, 112), (20, 130), (30, 102)
RCLS2: (0, 16), (10, 53), (20, 96), (30, 45)
編輯:
快速解決您的新更新。 你可以這樣做:
a = {'RCLS1':[(0, 20), (10, 112), (20, 130), (30, 102)], 'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]}
with open('E:\data.csv', 'a+') as f:
for k,v in a.items():
for j in v:
f.write("{0}: {1}\n".format(k, ", ".join(str(k) for k in j)))
輸出:
RCLS2: 0, 16
RCLS2: 10, 53
RCLS2: 20, 96
RCLS2: 30, 45
RCLS1: 0, 20
RCLS1: 10, 112
RCLS1: 20, 130
RCLS1: 30, 102
使用pandas
一個替代答案:
>>> import pandas as pd
>>> d={'RCLS1':[(0, 20), (10, 112), (20, 130), (30, 102)], 'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]}
>>> df=pd.DataFrame(d)
RCLS1 RCLS2
0 (0, 20) (0, 16)
1 (10, 112) (10, 53)
2 (20, 130) (20, 96)
3 (30, 102) (30, 45)
[4 rows x 2 columns]
>>> dfs=df.stack().reset_index(level=0)
level_0 0
RCLS1 0 (0, 20)
RCLS2 0 (0, 16)
RCLS1 1 (10, 112)
RCLS2 1 (10, 53)
RCLS1 2 (20, 130)
RCLS2 2 (20, 96)
RCLS1 3 (30, 102)
RCLS2 3 (30, 45)
>>> dfs=dfs[0].apply(pd.Series) # break the tuples in column with "name"=0
0 1
RCLS1 0 20
RCLS2 0 16
RCLS1 10 112
RCLS2 10 53
RCLS1 20 130
RCLS2 20 96
RCLS1 30 102
RCLS2 30 45
>>> dfs.to_csv('fileName.csv')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.