Python 3.x 当键不是常量时,将列表[Dict]写入CSV时获取标题的Python方式
我有一个需要写入csv文件的词典列表。以前,dict的键是有序的,因此我可以将最大dict的键作为我的列,并确保我拥有其他dict中使用的所有列名:Python 3.x 当键不是常量时,将列表[Dict]写入CSV时获取标题的Python方式,python-3.x,dictionary,export-to-csv,Python 3.x,Dictionary,Export To Csv,我有一个需要写入csv文件的词典列表。以前,dict的键是有序的,因此我可以将最大dict的键作为我的列,并确保我拥有其他dict中使用的所有列名: from csv import DictWriter data = [{"1":"a", "2":"b", "3":"c", "4":"d", "5":"e&
from csv import DictWriter
data = [{"1":"a", "2":"b", "3":"c", "4":"d", "5":"e"}, {"1":"a", "2":"b", "3":"c", "4":"d", "5":"e"}, {"1":"a", "2":"b", "3":"c", "4":"d"}, {"1":"a"}]
with open(location, "w", newline="") as file:
csv_dict_writer = DictWriter(file, max(data, key=len).keys())
csv_dict_writer.writeheader()
csv_dict_writer.writerows(data)
现在,键不再是顺序键了。因此,有时获取最大dict的键并不能覆盖其他词典中使用的所有键。这给了我一个错误。我现在要做的是解决这个问题:
from csv import DictWriter
data = [{"1":"a", "2":"b", "3":"c", "4":"d", "5":"e"}, {"1":"a", "2":"b", "3":"c", "4":"d", "6":"f"}, {"7":"g", "2":"b", "3":"c", "4":"d"}, {"8":"h"}]
with open(location, "w", newline="") as file:
csv_dict_writer = DictWriter(file, {key for elem in data for key in elem.keys()})
csv_dict_writer.writeheader()
csv_dict_writer.writerows(data)
这个解决方案确实丢失了键的顺序,这不是一件大事,但仍然是一个损失。我在网上查看了其他人的解决方案,我认为我的解决方案实际上比大多数人都好。然而,我的主要问题是,它感觉有点黑客相比,以前。有人知道更好的方法吗?您可以创建所有键的排序列表,然后在写入行时使用
dict.get
:
from csv import DictWriter
data = [{"1":"a", "2":"b", "3":"c", "4":"d", "5":"e"}, {"1":"a", "2":"b", "3":"c", "4":"d", "6":"f"}, {"7":"g", "2":"b", "3":"c", "4":"d"}, {"8":"h"}]
all_keys = sorted({k for d in data for k in d})
with open('data.csv', "w", newline="") as file:
csv_dict_writer = DictWriter(file, all_keys)
csv_dict_writer.writeheader()
for d in data:
row = {k: d.get(k) for k in all_keys}
csv_dict_writer.writerow(row)
创建此csv(来自LibreOffice的屏幕截图):
您可以创建所有键的排序列表,然后在写入行时使用
dict.get
:
from csv import DictWriter
data = [{"1":"a", "2":"b", "3":"c", "4":"d", "5":"e"}, {"1":"a", "2":"b", "3":"c", "4":"d", "6":"f"}, {"7":"g", "2":"b", "3":"c", "4":"d"}, {"8":"h"}]
all_keys = sorted({k for d in data for k in d})
with open('data.csv', "w", newline="") as file:
csv_dict_writer = DictWriter(file, all_keys)
csv_dict_writer.writeheader()
for d in data:
row = {k: d.get(k) for k in all_keys}
csv_dict_writer.writerow(row)
创建此csv(来自LibreOffice的屏幕截图):
如果你愿意使用熊猫,这是微不足道的
data = [{"1":"a", "2":"b", "3":"c", "4":"d", "5":"e"},
{"1":"a", "2":"b", "3":"c", "4":"d", "6":"f"},
{"7":"g", "2":"b", "3":"c", "4":"d"},
{"8":"h"}]
import pandas as pd
df = pd.DataFrame(data)
df.to_csv('filename.csv',index=None)
df
1 2 3 4 5 6 7 8
0 a b c d e NaN NaN NaN
1 a b c d NaN f NaN NaN
2 NaN b c d NaN NaN g NaN
3 NaN NaN NaN NaN NaN NaN NaN h
如果你愿意使用熊猫,这是微不足道的
data = [{"1":"a", "2":"b", "3":"c", "4":"d", "5":"e"},
{"1":"a", "2":"b", "3":"c", "4":"d", "6":"f"},
{"7":"g", "2":"b", "3":"c", "4":"d"},
{"8":"h"}]
import pandas as pd
df = pd.DataFrame(data)
df.to_csv('filename.csv',index=None)
df
1 2 3 4 5 6 7 8
0 a b c d e NaN NaN NaN
1 a b c d NaN f NaN NaN
2 NaN b c d NaN NaN g NaN
3 NaN NaN NaN NaN NaN NaN NaN h
这实际上是一个很好的方法。唯一的问题是我不能把熊猫加入这个项目。但我喜欢这样。我可以在其他项目中使用它。这实际上是一种很好的方法。唯一的问题是我不能把熊猫加入这个项目。但我喜欢这样。我可以在其他项目中使用它。排序在这里有什么区别?不管有没有,我都得到了同样的结果。@mnsr取决于Python版本,在3.7(3.6?)之前的Python版本中,字典是未排序的。所以,可以放心地对它们进行排序(但如果您确定,可以跳过这一步)。排序在这里有什么区别?不管有没有,我都得到了同样的结果。@mnsr取决于Python版本,在3.7(3.6?)之前的Python版本中,字典是未排序的。因此,对它们进行排序是安全的(但如果您确定,可以跳过这一步)。