根据两个文件中的匹配部分将数据从一个文件加载到另一个文件

Posted

技术标签:

【中文标题】根据两个文件中的匹配部分将数据从一个文件加载到另一个文件【英文标题】:Load data from one file to the other based on the matching part in two files 【发布时间】:2022-01-06 23:41:32 【问题描述】:

输入1

>Aa,Ab,Ac,ET0001
>Ba,Bb,Bc,ET0002
>Ca,Cb,Cc,ET0003

输入2

>Infor_a, aa:dfkvl, bb:csd, cc:ET0001
sldcksdlksjelkjfslkdjflskdjflskd
sldkcmowdimnwo
>Infor_b, aa:coeq, bb:ock, cc:ET0056
lskdjocisnmodk
>Infor_c, aa:vwjm, bb:cxj, cc:ET0751
spodcisdokfmnwoke
woeinmfwoeinflsdkvm
sldknmflwkenmlwk
>Infor_d, aa:wokx, bb:rkx, cc:ET0003
sodicjsodijsoi

预期输出

>Aa,Ab,Ac,ET0001
sldcksdlksjelkjfslkdjflskdjflskd
sldkcmowdimnwo
>Ba,Bb,Bc,ET0002
NaN
>Ca,Cb,Cc,ET0003
sodicjsodijsoi

代码

with open(input1, 'r') as fr1, open(input2, 'r') as fr2, open(output, 'w') as fw:

    temp = []
    while (fr2):
        line2 = fr2.readline()

        if line2.startswith('>'):
            templist  = line2.strip().split()
            for element in templist:
                if element.startswith('cc:ET'):
                    replaced_element = element.replace('cc:','')
                    temp.append(replaced_element)

        if not line2:
            break

我在模板中添加数据(从“input2”中的“ET”开始)。

    我想在“>”下获取与“input2”中的“ETnumber”匹配的信息。 2.如果'ETnumber'和'input1'匹配,我想在'input1'的每一行下写下'>'下的信息。

你对我有什么建议吗,从我的代码下一步(使用 os.listdir)?

【问题讨论】:

您确定要将文字文本“NaN”写入输出文件吗? @DarkKnight 是的!文字'NaN'!我会没事的。 【参考方案1】:

您可以使用字典来保存 f2 中的匹配项,然后是一个简单的循环:

import re
with open(input1, 'r') as fr1, open(input2, 'r') as fr2, open(output, 'w') as fw:
    values = dict(re.findall('(ET\d+)\n([^>]+)', f2.read()))
    for line in f1:
        fw.write(line)
        fw.write(values.get(line.rsplit(',',1)[-1],'NaN\n'))

输出:

>Aa,Ab,Ac,ET0001
sldcksdlksjelkjfslkdjflskdjflskd
sldkcmowdimnwo
>Ba,Bb,Bc,ET0002
NaN
>Ca,Cb,Cc,ET0003
sodicjsodijsoi

注意。就像你之前的问题一样,不要做你的怪事:

while (f):
    line = f.readline()
    ...
    if not line:
        break

只要做:

for line in f:
    ...

【讨论】:

感谢您的评论。我会尝试使用 for 循环而不是 while 循环。【参考方案2】:

这不是对@mozway 提供的优秀产品的功能改进,而是采用了一步一步的方法,新手可能更容易理解:

import os
from collections import defaultdict

TILDE = '~'
DIR = 'logan'
HOME = os.path.expanduser(TILDE)
NAN = 'NaN\n'
CC = 'cc:'

I_1 = dict()

with open(os.path.join(HOME, DIR, 'input1.txt')) as infile:
    for line in infile:
        t = line.strip().split(',')
        I_1[t[-1]] = t

I_2 = defaultdict(list)
k = TILDE

with open(os.path.join(HOME, DIR, 'input2.txt')) as infile:
    for line in infile:
        if line.startswith('>'):
            i = line.find(CC)
            if i >= 0:
                k = line[i+len(CC):].strip().split(',')[0]
        else:
            I_2[k].append(line)

with open(os.path.join(HOME, DIR, 'output1.txt'), 'w') as outfile:
    for k, v in I_1.items():
        print(f'",".join(v)', file=outfile)
        print(f'"".join(I_2.get(k, NAN))', file=outfile, end='')

【讨论】:

非常感谢您,先生!很抱歉,但在第二步(input2)中,如果“>”行是这种形式,您的代码将如何更改? --> >Infor_a, aa:dfkvl, bb:csd, cc:ET0001, dd:sdcsd, ee:wecf 先生!我变了!!! k = line.strip().split(' ')[-3].replace('cc:', '') 像这样

以上是关于根据两个文件中的匹配部分将数据从一个文件加载到另一个文件的主要内容,如果未能解决你的问题,请参考以下文章

如果不同工作表上的值匹配,则将数据从一张工作表复制到另一张工作表

可以将行中的数据从一张纸复制到另一张纸吗?

MFC中,如何将CBitmap中的图片复制到另一CBitmap的一块区域中,即如何读取一个CBit

将数据从 plist 加载到另一个类

一台电脑上的OUTLOOKEXPRESS地址,简便方法如何转移到另一台电脑?

根据查找值将值从一张表匹配并粘贴到另一张表中