繁体   English   中英

Python:将具有行标题的文本文件读取到新的CSV / Excel中

[英]Python: Read text file with column headers in rows into new CSV/Excel

我有一个文本文件,我想输出到新的.csv文件中。 列标题与数据一致,我无法弄清楚如何处理文件。 我是python新手。

输入文件格式为:
{“第1列名称”:“第1列值”,“第2列名称”:“第2列值”,“第3列名称”:“第3列值”,“第4列名称”:“第4列值”,“第5列名称”:“第5列的值”}

我想要的输出文件格式是:
第1行中的列标题
第2行及其后的逗号分隔值

在某些情况下,某个值可能为空,所以我需要考虑到这一点,以使这些值不会移至错误的列标题。

提前致谢!

您输入的文件格式不是100%清除。 看起来是JSON,我假设每行有一个JSON。 我进一步假设单个条目之间没有换行符。

您的问题最好分为两部分。

1.读取输入文件-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将是字典的列表,输出:

[{'header2': 'value1.2', 'header1': 'value1.1'}, {'header2': 'value2.2', 'header1': 'value2.1'}]

2.从字典列表中写入输出文件

2a。 确定字段列表

除非您已有固定的字段列表,否则可能需要首先确定该列表。

您可以仔细阅读每个字典,获取其键并为其建立唯一列表,如下所示:

from functools import reduce

all_keys = sorted(reduce(lambda acc, item: acc | set(item.keys()), data, set()))

print(all_keys)

在这里,我们从一个空的set() (在右侧)开始,这将是第一个accdata每个字典都将成为item 我们正在向acc添加(使用|运算符) keys() ,返回值将成为下一轮的acc (或最终返回值)。 由于我们使用的是集合,因此不会重复。 sorted只是给了它最后的印象,但是是可选的。

输出:

['header1', 'header2']

2b。 编写CSV

好吧,这里有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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM