python - 将文本文件中的不一致数据合并到一个 Excel 电子表格中
问题描述
我有大量带有数据的文本文件;每个文件都可以单独导入excel。但是,虽然文件之间的大多数列是相同的,但在许多文件中添加/缺少一列或两列,因此当我合并所有文本文件并将其放入 excel 时,许多数据列被移动。
我可以为所有可能的数据条目制作一个“主列表”,但我不确定如何告诉 excel 将某些类型的数据放在特定的列中。
例如,如果我有两个看起来像这样的文件:
- 名称 年份 食用色素
- Bob 2018 蛋糕蓝
- 查理 2017 无花果红
和
- 姓 姓名 年龄 年份 颜色 尺码
- 莉莉詹姆斯 17 2021 绿色 0
我将如何在excel中像这样合并它们:
- 姓 姓名 年龄 年份 食物 颜色 大小
- na Bob na 2018 Cake Blue na
- na Charlie na 2017 Figs Red na
- 莉莉詹姆斯 17 2021 na 绿色 0
解决方案
问题:将文本文件中的不一致数据合并到一个 Excel 电子表格中
此解决方案使用以下build-in
和moudules
:
该解决方案的核心是使用对象和
参数对列名进行规范化,以处理不一致的列。set()
.DictWriter(..., extrasaction='ignore')
输出格式为CSV
,可以从 MS-Excel 中读取。
给定的数据,由
blank
text1 = """Name Year Food Color Bob 2018 Cake Blue Charlie 2017 Figs Red """ text2 = """LastName Name Age Year Color Size Lily James 17 2021 green 0 """
打开三个文件并获取标题。
聚合所有列名,使用set()
. 为文件
创建一个DictReader
对象。in_*
注意:替换
io.StringIO(...
为open(<Path to file>)
with io.StringIO(text1) as in_text1, \ io.StringIO(text2) as in_text2, \ io.StringIO() as out_csv: columns = set() reader = [] for n, fh in enumerate([in_text1, in_text2]): fieldnames = fh.readline().rstrip().split() [columns.add(name) for name in fieldnames] reader.append(csv.DictReader(fh, delimiter=' ', fieldnames=fieldnames))
使用规范化的列名创建一个
DictWriter
对象。参数,处理不一致的列。extrasaction='ignore'
注意:不保证列顺序。如果您需要定义的顺序,
list(columns)
请在分配给 之前根据您的需要对 进行排序fieldnames=
。writer = csv.DictWriter(out_csv, fieldnames=list(columns), , extrasaction='ignore') writer.writeheader()
循环
DictReader
读取所有行的所有对象并将其写入目标.csv
文件。for dictReader in reader: for _dict in dictReader: writer.writerow(_dict)
输出:
print(out_csv.getvalue()) Color,LastName,Year,Food,Age,Name,Size Blue,,2018,Cake,,Bob, Red,,2017,Figs,,Charlie, green,Lily,2021,,17,James,0
用 Python 测试:3.4.2
推荐阅读
- mongodb - Mongoose - 按外国财产过滤
- javascript - npm run dev 在 Laravel 项目中不起作用:TypeError: program.parseAsync is not a function
- javascript - TypeError: .default.auth.signout 不是 REACT 和 Firebase 中的函数
- python - 电报 API 自动加入频道
- jupyter-notebook - 如何在 Jupyter Notebook 中切换 markdown 单元格的可见性?
- c# - 搜索后下拉列表中的元素不可点击异常(C# Selenium)
- reactjs - 如何保持 FluentUI SearchBox 保持图标不变?
- mysql - 如何减少超过 20GB 的 MySQL 表的大小,尽管它是空的?
- reactjs - React 设置状态条件(如果是 else 或三元)不起作用。(即使是假的也能工作)
- reactjs - React Material-UI Select 没有反映变化