Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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将dict列表写入文件_Python - Fatal编程技术网

用python将dict列表写入文件

用python将dict列表写入文件,python,Python,在将db输出写入文件时,我在动态映射字典值方面遇到问题。 情景: new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'}, {'Table':'A', 'Column':'C2', 'DataType':'varchar'}, {'Table':'A', 'Column':'C2', 'DataType':'numeric'} ] # I want to write the data in

在将db输出写入文件时,我在动态映射字典值方面遇到问题。 情景:

new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'},
        {'Table':'A', 'Column':'C2', 'DataType':'varchar'},
        {'Table':'A', 'Column':'C2', 'DataType':'numeric'}
       ]
# I want to write the data into a file.
Table|Column|DataType
A|C1|int
A|C2|varchar
A|C3|numeric
我试着做下面的事情

header = []
with open('my_log.log', 'w',encoding='utf-8') as log:
   for n in new_list:
      for i in n.keys():
        header.append(i)
   log.write("|".join(set(header)))
   log.write("\n")
   for data in new_list:
      # don't want to hard code the keys like below
      log.write("{Table}|{Column}|{DataType} \n".format(**data))
      # need to do something so that I dont have to hard code the keys as it  is dynamic in nature
      # and also my file output should match with the header generated in the previous line
      log.write("{???}".format(**data))

任何建议

下面是一种使用动态标题列表写出数据的方法:

new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'},
        {'Table':'A', 'Column':'C2', 'DataType':'varchar'},
        {'Table':'A', 'Column':'C2', 'DataType':'numeric'}
       ]

header = new_list[0].keys()

with open('my_log.log', 'w') as log:
   log.write("|".join(header))
   log.write("\n")
   for data in new_list:
      log.write("|".join(data[h] for h in header))
      log.write("\n")

下面是一种使用动态标题列表写出数据的方法:

new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'},
        {'Table':'A', 'Column':'C2', 'DataType':'varchar'},
        {'Table':'A', 'Column':'C2', 'DataType':'numeric'}
       ]

header = new_list[0].keys()

with open('my_log.log', 'w') as log:
   log.write("|".join(header))
   log.write("\n")
   for data in new_list:
      log.write("|".join(data[h] for h in header))
      log.write("\n")
使用蟒蛇熊猫

import pandas as pd
tableA = pd.DataFrame([[1,2,3],[4,5,6]], columns=["C1","C2","C3"])
tableA.to_csv("mytables.csv",sep="|")
输出:mytables.csv

|C1 | C2 | C3

0 | 1 | 2 | 3

1 | 4 | 5 | 6

使用python

import pandas as pd
tableA = pd.DataFrame([[1,2,3],[4,5,6]], columns=["C1","C2","C3"])
tableA.to_csv("mytables.csv",sep="|")
输出:mytables.csv

|C1 | C2 | C3

0 | 1 | 2 | 3


1 | 4 | 5 | 6

您正在编写分隔文本,因此应该使用
csv
模块。它正好有一个对象,这是完美的

import csv

new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'},
    {'Table':'A', 'Column':'C2', 'DataType':'varchar'},
    {'Table':'A', 'Column':'C2', 'DataType':'numeric'}
   ]

with open("my_log.log", "wb") as f:
    writer = csv.DictWriter(f,
                            fieldnames=["Table", "Column", "DataType"],
                            delimiter="|")
    writer.writerows(new_list)

您正在编写分隔文本,因此应该使用
csv
模块。它正好有一个对象,这是完美的

import csv

new_list = [{'Table':'A', 'Column':'C1', 'DataType':'int'},
    {'Table':'A', 'Column':'C2', 'DataType':'varchar'},
    {'Table':'A', 'Column':'C2', 'DataType':'numeric'}
   ]

with open("my_log.log", "wb") as f:
    writer = csv.DictWriter(f,
                            fieldnames=["Table", "Column", "DataType"],
                            delimiter="|")
    writer.writerows(new_list)


字典可以使用pickle序列化。您可以查看,也可以使用<代码> JSON.DUPP写出列表。可以在里面找到更多的信息。第二种方法是向JSON倾销,但是如果您想构建自己的文件,那么认真考虑我在接受的解决方案上的方法。code>csv.DictWriter是“一种……显而易见的方法”,可以使用pickle序列化词典。您可以查看,也可以使用<代码> JSON.DUPP写出列表。可以在里面找到更多的信息。第二种方法是向JSON倾销,但是如果您想构建自己的文件,那么认真考虑我在接受的解决方案上的方法。code>csv.DictWriter是“一种……显而易见的方法”,请注意,这并不能保证列的顺序,因为字典是无序的。@AdamSmith True,但如果数据被读回字典,则这并不重要。绝对是!虽然如果数据被读回字典,您可以使用pickle或JSON:)进行序列化,但请注意,这并不能保证列的顺序,因为字典是无序的。@AdamSmith True,但是如果数据被读回字典,则无所谓。绝对是这样!尽管如果数据被读回字典,您可以使用pickle或JSON进行序列化:)有没有办法动态设置字段名,因为新的_列表会根据查询的不同而变化?@AdamSmith@Pradeep当然,你通常可以用任何方法来操纵它。你将遇到的问题与布伦特·沃什伯恩的答案相同。字典键没有顺序,因此您不能保证
{“A”:1,“B”:2,“C”:3}.keys()
将为您提供
[“A”,“B”,“C”]
而不是
[“B”,“C”,“A”]
(或任何其他任意顺序)。如果您需要获取任意键的列表,并且您完全关心它们的顺序,我会事先将它们定义为集合。OrderedDict,或者简单地决定“我使用的是所有这些键的字母排序。”(
fieldnames=sorted(新列表[0].keys())
)@Pradeep很高兴能帮上忙!有什么方法可以设置UTF-8编码,因为我得到下面的编码错误。“UnicodeEncodeError:'charmap'编解码器无法对位置4:字符映射到的字符'\u0142'进行编码。”。另外,我只是将模式改为“w”,而不是“wb”,以便在我的场景中工作@AdamIs有没有办法动态设置字段名,因为新的_列表会根据查询的不同而变化?@AdamSmith@Pradeep当然,你通常可以用任何方法来操纵它。你将遇到的问题与布伦特·沃什伯恩的答案相同。字典键没有顺序,因此您不能保证
{“A”:1,“B”:2,“C”:3}.keys()
将为您提供
[“A”,“B”,“C”]
而不是
[“B”,“C”,“A”]
(或任何其他任意顺序)。如果您需要获取任意键的列表,并且您完全关心它们的顺序,我会事先将它们定义为集合。OrderedDict,或者简单地决定“我使用的是所有这些键的字母排序。”(
fieldnames=sorted(新列表[0].keys())
)@Pradeep很高兴能帮上忙!有什么方法可以设置UTF-8编码,因为我得到下面的编码错误。“UnicodeEncodeError:'charmap'编解码器无法对位置4:字符映射到的字符'\u0142'进行编码。”。另外,我只是将模式改为“w”,而不是“wb”,以便在我的场景中工作@亚当