根据两个文件中的匹配部分将数据从一个文件加载到另一个文件
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