Python 并排合并以逗号分隔的文本文件
Python side-by-side merge of comma-delimited text files
假设我有两个文本文件,内容如下所示。
文本文件 1:
Apple, 0
Pear, 1
Orange, 0
文本文件 2:
Apple, 1
Pear, 1
Orange, 1
我希望以并排方式合并它们,只保留文本文件 1 的左侧 "column",这两个文本文件相同。也就是说,我希望生成以下合并文本文件。
合并文本文件:
Apple, 0, 1
Pear, 1, 1
Orange, 0, 1
我正在尝试找到如何——在相当少量的代码中——执行这样的合并。但是,在实际问题中,可以有任意数量的文本文件。我如何在 Python 中执行此操作?
假设:
- 每个文本文件的行数完全相同。
- 每个文本文件都是逗号分隔的文件,每行恰好有 1 个逗号。
- 对于每个文本文件中的每一行,逗号左侧的值完全相同。
我会 zip
然后同时浏览它们。进行一些拆分和格式化,然后逐行写入新文件
with open('text1.csv') as f1, open('text2.csv') as f2, open('merge.csv', 'w') as fOut:
for line1, line2 in zip(f1, f2):
name, val1 = line1.strip().split(',')
val2 = line2.strip().split(',')[1]
fOut.write('{}, {}, {}\n'.format(name, val1, val2))
试试 csvkit,它还有一个命令行实用程序,可能更容易使用:
首先安装:
pip install csvkit
然后:
csvjoin --outer file1.csv file2.csv
fileinput.input 将采用文件列表,使用 ordereddict 连接所有值并保持顺序:
from collections import OrderedDict
d= OrderedDict()
import fileinput
with open("joined.txt","w") as f:
for line in fileinput.input(["file1.txt","file2.txt","file3.txt","file4.txt"]):
spl = line.strip().split(",")
d.setdefault(spl[0],[])
d[spl[0]] += spl[1:]
for k,v in d.items():
f.write("{} {}\n".format(k,",".join(v)))
如果它们都在自己的目录中,您可以将 os.listdir 传递给 fileinput:
from collections import OrderedDict
d= OrderedDict()
import fileinput
import os
with open("joined.txt","w") as f:
for line in fileinput.input(os.listdir("path_to")):
spl = line.strip().split(",")
d.setdefault(spl[0],[])
d[spl[0]] += spl[1:]
for k,v in d.items():
f.write("{} {}\n".format(k,",".join(v)))
如果它们不是唯一的文件,而是遵循某种模式,您可以使用 glob:
import fileinput
import os
import glob
with open("joined.txt","w") as f:
for line in fileinput.input(glob.glob("./file*.txt")):
spl = line.strip().split(",")
d.setdefault(spl[0],[])
d[spl[0]] += spl[1:]
for k,v in d.items():
f.write("{} {}\n".format(k,",".join(v)))
假设我有两个文本文件,内容如下所示。
文本文件 1:
Apple, 0
Pear, 1
Orange, 0
文本文件 2:
Apple, 1
Pear, 1
Orange, 1
我希望以并排方式合并它们,只保留文本文件 1 的左侧 "column",这两个文本文件相同。也就是说,我希望生成以下合并文本文件。
合并文本文件:
Apple, 0, 1
Pear, 1, 1
Orange, 0, 1
我正在尝试找到如何——在相当少量的代码中——执行这样的合并。但是,在实际问题中,可以有任意数量的文本文件。我如何在 Python 中执行此操作?
假设:
- 每个文本文件的行数完全相同。
- 每个文本文件都是逗号分隔的文件,每行恰好有 1 个逗号。
- 对于每个文本文件中的每一行,逗号左侧的值完全相同。
我会 zip
然后同时浏览它们。进行一些拆分和格式化,然后逐行写入新文件
with open('text1.csv') as f1, open('text2.csv') as f2, open('merge.csv', 'w') as fOut:
for line1, line2 in zip(f1, f2):
name, val1 = line1.strip().split(',')
val2 = line2.strip().split(',')[1]
fOut.write('{}, {}, {}\n'.format(name, val1, val2))
试试 csvkit,它还有一个命令行实用程序,可能更容易使用:
首先安装:
pip install csvkit
然后:
csvjoin --outer file1.csv file2.csv
fileinput.input 将采用文件列表,使用 ordereddict 连接所有值并保持顺序:
from collections import OrderedDict
d= OrderedDict()
import fileinput
with open("joined.txt","w") as f:
for line in fileinput.input(["file1.txt","file2.txt","file3.txt","file4.txt"]):
spl = line.strip().split(",")
d.setdefault(spl[0],[])
d[spl[0]] += spl[1:]
for k,v in d.items():
f.write("{} {}\n".format(k,",".join(v)))
如果它们都在自己的目录中,您可以将 os.listdir 传递给 fileinput:
from collections import OrderedDict
d= OrderedDict()
import fileinput
import os
with open("joined.txt","w") as f:
for line in fileinput.input(os.listdir("path_to")):
spl = line.strip().split(",")
d.setdefault(spl[0],[])
d[spl[0]] += spl[1:]
for k,v in d.items():
f.write("{} {}\n".format(k,",".join(v)))
如果它们不是唯一的文件,而是遵循某种模式,您可以使用 glob:
import fileinput
import os
import glob
with open("joined.txt","w") as f:
for line in fileinput.input(glob.glob("./file*.txt")):
spl = line.strip().split(",")
d.setdefault(spl[0],[])
d[spl[0]] += spl[1:]
for k,v in d.items():
f.write("{} {}\n".format(k,",".join(v)))