我有一个文本文件要输出到新的.csv文件中。列标题与数据内联,我无法弄清楚如何处理文件。我是一个蟒蛇新手。
输入文件格式为:
{“第1列名称”:“第1列值”,“第2列名称”:“第2列值”,“第3列名称”:“第3列值”,“第4列名称”:“第4列值”,“第5列名称“:”第5列值“}
我想要的输出文件格式是:
第1行中的列标题
第2行及以后的逗号分隔值
有时值可能为空,因此我需要考虑到这一点,因此值不会转移到错误的列标题。
提前致谢!
答案 0 :(得分:0)
您的输入文件格式不是100%清除。看起来它是JSON,我假设每行有一个JSON。我进一步假设单次输入之间没有换行符。
您的问题最好分为两部分。
假设数据test.jl
(JSON行的jl):
{"header1": "value1.1", "header2": "value1.2"}
{"header1": "value2.1", "header2": "value2.2"}
然后你可以逐行读取该文件,JSON解析每一行:
import json
with open('test.jl') as input_f:
data = [json.loads(line) for line in input_f]
print(data)
data
这里将是dict的列表,输出:
[{'header2': 'value1.2', 'header1': 'value1.1'}, {'header2': 'value2.2', 'header1': 'value2.1'}]
除非您已经有固定的字段列表,否则您可能需要先确定该列表。
您可以查看每个字典,获取其密钥并构建一个唯一的列表,如下所示:
from functools import reduce
all_keys = sorted(reduce(lambda acc, item: acc | set(item.keys()), data, set()))
print(all_keys)
此处我们从空set()
开始(右侧),这将是第一个acc
,data
中的每个字典将变为item
。我们正在使用|
运算符添加keys()
到acc
,返回值将成为下一轮acc
(或最终返回值)。由于我们使用套装,因此不会重复。 sorted
只是给它一个最后的触摸,但是是可选的。
输出:
['header1', 'header2']
嗯,有DictWriter似乎符合要求。
from csv import DictWriter
with open('test.csv', 'w') as csv_f:
csv_writer = DictWriter(csv_f, fieldnames=all_keys)
csv_writer.writeheader()
csv_writer.writerows(data)
test.csv中的输出:
header1,header2
value1.1,value1.2
value2.1,value2.2