如何在Python中根据共同值合并两个文本文件

1 投票
2 回答
2341 浏览
提问于 2025-04-18 10:33

我有两个不同的文件。

我需要把这两个文件合并成一个文件。它们之间有一个共同的值。这两个文件的格式是这样的。匹配的内容不会是按顺序排列的。比如,数据集1的第一行可能和数据集2的第一行不匹配,更有可能的是数据集1的第一行会和数据集2的第16行或者第45行匹配。

加粗的部分就是匹配的值。任何方向上的帮助都非常感谢。

BEEC,BE-EC,,154.7,46.07,,31.63,54.6,4833.6,5.06
BPLZ,BE-LZ,,390.6,62.62,,49.0,145.0,27.3,61.52
BFLP,BF-OP,,180.1,34.89,,40.0,58.26,8533.8,7.31


MRM1234-BEEC-1635753E001     25.6    70.29
MRM1234-BPLZ-1814737E003     8.12    18.13
MRM1234-BFLP-2470883E001     12.92   18.8

我知道怎么用 line.split 来获取每个元素的数组。

我知道怎么在第二个数据集的第一列 L[6:4] 中查找,来得到匹配的四个字母的值。

我尝试了好几种建议的方法,但都没有成功。

我该如何将所有列合并成一行,并通过这个独特的四位数标识符连接起来呢?匹配这个独特的值,然后写到一行的过程让我感到困惑。

2 个回答

0

抱歉让你困惑了...

def parse(d1, d2):
    d1 = d1.split('\n')
    data1 = [x.split(',') for x in d1 if x]
    d2 = d2.split('\n')
    data2 = [x.split(' ') for x in d2 if x]
    target = []
    for x in data2:
        d = [y for y in x if y]
        dd = d[0].split('-')
        dd.extend(d[1:])
        target.append(dd)
    ret = []
    while data1:
        x = data1.pop()
        for y in target:
            if x[0] == y[1]:
                z = x
                z.extend(y[-2:])
                ret.append(z)
    for x in ret:
        print(x)


parse(data1, data2)

这里的data1和data2是文件里的内容

2

文件 dat1 的内容:

BEEC,BE-EC,,154.7,46.07,,31.63,54.6,4833.6,5.06
BPLZ,BE-LZ,,390.6,62.62,,49.0,145.0,27.3,61.52
BFLP,BF-OP,,180.1,34.89,,40.0,58.26,8533.8,7.31

文件 dat2 的内容:

MRM1234-BEEC-1635753E001     25.6    70.29
MRM1234-BPLZ-1814737E003     8.12    18.13
MRM1234-BFLP-2470883E001     12.92   18.8

使用这个简单粗暴的脚本,可以把两个文件的每一行合并在一起,像下面这样描述的。

dat1 = {}
with open('dat1') as f:
    for line in f.readlines():
        dat1[line.split(',')[0]] = line.strip().split(',')[1:]

dat2 = {}
with open('dat2') as f:
    for line in f.readlines():
        key = line.strip().split()[0].split('-')[1]
        dat2[key] = line.strip().split()[1:]

for key in dat1.keys():
    print("%s,%s,%s" % (key, str.join(',', dat1[key]), str.join(',', dat2[key])))

这样会产生以下输出结果。

BFLP,BF-OP,,180.1,34.89,,40.0,58.26,8533.8,7.31,12.92,18.8
BEEC,BE-EC,,154.7,46.07,,31.63,54.6,4833.6,5.06,25.6,70.29
BPLZ,BE-LZ,,390.6,62.62,,49.0,145.0,27.3,61.52,8.12,18.13

撰写回答