繁体   English   中英

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

[英]If string in one file matches string in another, print line and next line

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

文件1

>name1
>name3
>name4

文件2

>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来完成?)

感谢您的任何建议!

首要问题:

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为单词边界。 是用于正则表达式测试的网站链接。

第二期:

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

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

  1. 布尔标志。

    要实现这一点,您应该在循环之前声明布尔值,并将其设置为False 在内部循环中,如果此变量为True ,则应将行写到outfile ,然后将其更改回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更改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() 
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

"""

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM