如果一个文件中的字符串与另一个文件中的字符串匹配,则打印行和下一行

时间:2019-05-14 21:08:20

标签: python python-3.x string

我在整理一些我一直在努力的python代码时遇到麻烦,将不胜感激。我有两个文件:

file1

>name1
>name3
>name4

file2

>name1 blah blah
aaaaaaaaaaaaaaaaaaaaaaaaa
>name2 blah blah
cccccccaaaaaaaaaaaaaaaaaa
>name3 blah blah
aaaaaattttttttttaaaaaaaaa
>name4 blah blah
aaaaaattttttttttggggggggg
>name5 blah blah
aaaggggcccctttttggggggggg

file1的每一行都包含一个在file2中也找到的字符串。对于file1的每一行,我想在file2中找到它匹配的行,然后打印该行和下一行。这是我想要的最终结果:

>name1 blah blah
aaaaaaaaaaaaaaaaaaaaaaaaa
>name3 blah blah
aaaaaattttttttttaaaaaaaaa
>name4 blah blah
aaaaaattttttttttggggggggg

到目前为止,我有以下代码:

nums=set()
    with open("file1.txt") as file1:
        for line in file1:
            nums.add(line.strip())

    with open("file2.txt") as file2, open("out.txt", "wt") 
    as outfile:
        for line in file2:
            if any(word in line for word in nums):
                outfile.write(line)

此代码目前包含两个问题:

  • file2中与file1中的字符串匹配的任何子字符串都被打印到outfile中(使用此处的示例,如果> name3位于集合num中,则以> name3以及> name31和> name367开头的行将打印)

  • 我还没有弄清楚如何同时显示包含匹配项的行和下一行(也许可以使用islice完成)?

谢谢您的建议!

2 个答案:

答案 0 :(得分:1)

第一期:

  

file2中与file1中的字符串匹配的任何子字符串都被打印到outfile中(使用此处的示例,如果> name3在集合num中,则将打印以> name3以及> name31和> name367开头的行)

此问题可以通过两种方法解决。

  1. 只需添加空间。

    如果您确定在“关键字”之后留有空格,则可以添加只需添加空格

    示例:

    if any(word + " " in line for word in nums):
    
  2. 正则表达式。

    要解决此问题,可以使用正则表达式。您应该import re并进行以下更改:

    if any(word in line for word in nums):
    

    收件人:

    if any(re.match(f"^{word}\\b", line) for word in nums):
    

    说明^表示行首,\b是单词边界。 Here是用于正则表达式测试的网站链接。

第二个问题:

  

我还没有弄清楚如何同时显示包含匹配项的行和下一行(也许可以使用islice完成)?

您使用for line in file2:遍历文件,该文件逐行读取文件。如果要打印下一行,可以使用几种方法。

  1. 布尔型标志。

    要实现此目的,您应在循环前声明布尔值并将其设置为False。在内部循环中,如果此变量为outfile,则应将行写入True,然后将其更改回False。您应在当前条件内为此变量设置True

    示例:

    read_next = False
    for line in file2:
        if read_next:
            outfile.write(line)
            read_next = False
       if any(re.match(f"^{word}\\b", line) for word in nums):
            outfile.write(line)
            read_next = True
    
  2. 将循环从for更改为while

    您可以使用readline()方法(docs)手动遍历文件。

    示例:

    line = file2.readline()
    while line:
        line = line.strip()
        if any(re.match(f"^{word}\\b", line) for word in nums):
            outfile.write(line)
            line = file2.readline()
            if line:
                outfile.write(line)
            else: # if the end of file reached
                outfile.write("\n") # delete it in case if you don't need this
                break
        line = f.readline()
    

答案 1 :(得分:0)

l=[]
# getting all the data from file and dividing them in two part and appending 
#them in a list
with open(r'C:\Users\user\RegForm.txt','r') as file:
    count =0 
    tmp=file.read().split('\n')
    for line in range(1,len(tmp),2):

        l.append([tmp[line-1],tmp[line]])


# getting all the value to search from file in a list
to_find=[]
with open(r'C:\Users\user\untitled0.txt','r') as file:
    for line in file:
        to_find.append(line.strip('\n'))

res =[]
# searching for file if they exist or not

for i in to_find:
    for j in l:
        if i in j[0]:
            print(j[0],j[1],sep='\n')
            break

"""
output

>name1 blah blah
aaaaaaaaaaaaaaaaaaaaaaaaa
>name3 blah blah
aaaaaattttttttttaaaaaaaaa
>name4 blah blah
aaaaaattttttttttggggggggg

"""