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. 每个文本文件的行数完全相同。
  2. 每个文本文件都是逗号分隔的文件,每行恰好有 1 个逗号。
  3. 对于每个文本文件中的每一行,逗号左侧的值完全相同。

我会 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)))