【问题标题】: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”开始)。

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

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

【问题讨论】:

  • 您确定要将文字文本“NaN”写入输出文件吗?
  • @DarkKnight 是的!文字'NaN'!我会没事的。

标签: python append strip temp startswith


【解决方案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:', '') 像这样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2020-04-25
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多