在python中读/写字典到csv文件
Posted
技术标签:
【中文标题】在python中读/写字典到csv文件【英文标题】:Reading/Writing out a dictionary to csv file in python 【发布时间】:2016-03-21 22:39:17 【问题描述】:python 新手,csv 文件的文档有点混乱。
我有一本如下所示的字典:
key1: (value1, value2)
key2: (value1, value2)
key3: (value1, value2)
....
我想以每行包含键,后跟两个值的格式将这些写入 csv 文件。
我还希望以后能够从文件中将它们读回到字典中。
【问题讨论】:
阅读此docs.python.org/3/tutorial,尝试自己解决,来这里(如果遇到问题)提出具体问题。 为什么是 CSV?如果要保存和加载,可以查看pickle
或 json
之类的内容。两者都有相当可靠的转储和加载方法,json
输出但用户可读。
我将在 excel 中使用这些值进行一些计算。但将在多个文件中使用,以便我可以保持运行总数。
提供一些代码,然后提供一个示例来说明您希望输出的样子。我想我可以看到它,但不完全确定。此外,如前所述,这可能不是最适合 csv 模块。如果不了解您的数据,您的结构对于阅读和写作都不是真正自然的。因此,具体而言,如果不进行操作,您将无法将其读回字典。我们使用 csv.DictWriter 和 csv.DictReader 但也这样做,因此我们必须确保我们的数据结构为字典列表,键是标题,值是单元格内容
a) 是 value1, value2
数字还是字符串,在这种情况下,当您说要输出 key: value1, value2
时,可能需要引用它们(所以内部逗号不要'不要被误解)并可能转义(这样内部换行符就不会被误解)意思是key, value1, value2
,这样代码必须知道它是用于字典的,或者说它是像key: value1, value2
这样的字典的标准格式,比如pandas.to_csv
会写吗?
【参考方案1】:
为此我强烈推荐Pandas。
转换为 Pandas 数据帧:
import pandas as pd
d =
'a': (1, 101),
'b': (2, 202),
'c': (3, 303)
df = pd.DataFrame.from_dict(d, orient="index")
创建一个 CSV 文件:
df.to_csv("data.csv")
将 CSV 文件作为 DataFrame 读回:
df = pd.read_csv("data.csv", index_col=0)
将DataFrame转换回原来的字典格式:
d = df.to_dict("split")
d = dict(zip(d["index"], d["data"]))
编辑:既然您提到您的目标是在 Excel 中使用输出文件,Pandas to_excel() 和 read_excel() 可能对您更有用,因为它们可以更好地保留转换之间的内容。 此外,您可能希望完全跳过 Excel 并使用 standard Python scientific stack。
【讨论】:
使用pandas的好方法是to_csv,不需要open命令,参考我的回答。 不想听起来很挑剔,但有谁知道如何只使用裸 python 来做到这一点?作为python的初学者,真的不想使用其他包。 如果您正在寻找依赖关系最小的东西,那么 itsneo 的答案可能就是您的目标。 我更喜欢这个答案而不是所选答案。 使用index=False
可能对大多数用户有帮助。【参考方案2】:
我没有发现在这里使用 Pandas 有足够的好处,因为问题很简单。
还要注意 OP,如果您想将值存储到文件中只是为了读取它,只需使用 JSON 或 Python 的搁置模块。仅当我们需要与潜在的 Excel 用户交互时,才应尽量减少导出为 CSV。
以下代码将字典转换为 CSV
value1 = 'one'
value2 = 'two'
d =
'key1': (value1, value2),
'key2': (value1, value2),
'key3': (value1, value2)
CSV ="\n".join([k+','+','.join(v) for k,v in d.items()])
#You can store this CSV string variable to file as below
# with open("filename.csv", "w") as file:
# file.write(CSV)
这段代码解释了列表推导中发生的事情。
CSV = ""
for k,v in d.items():
line = ",\n".format(k, ",".join(v))
CSV+=line
print CSV
【讨论】:
这看起来更像是我能理解的东西。那么在你写“for k,v in d.items()”的地方,v 参数(假设值的标签)是否会自动发现那里有 2 个值(一个元组)?即这个打印键,值1,值2? 是的,v
被假定为一个元组,",".join
表示用逗号连接这些元组变量。我已经用 for 循环详细说明了列表理解。希望这会更容易,更易读。【参考方案3】:
我会使用 pandas,它可以在一行中完成:
import pandas as pd
dic = 'key1':['v1','v2'], 'key2':['vv','gg']
pd.DataFrame(dic).T.reset_index().to_csv('myfile.csv', header=False, index=False)
【讨论】:
以上是关于在python中读/写字典到csv文件的主要内容,如果未能解决你的问题,请参考以下文章