Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 当键不是常量时,将列表[Dict]写入CSV时获取标题的Python方式_Python 3.x_Dictionary_Export To Csv - Fatal编程技术网

Python 3.x 当键不是常量时,将列表[Dict]写入CSV时获取标题的Python方式

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&

我有一个需要写入csv文件的词典列表。以前,dict的键是有序的,因此我可以将最大dict的键作为我的列,并确保我拥有其他dict中使用的所有列名:

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版本中,字典是未排序的。因此,对它们进行排序是安全的(但如果您确定,可以跳过这一步)。