簡體   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