我在整理一些我一直在努力的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完成)?
谢谢您的建议!
答案 0 :(得分:1)
file2中与file1中的字符串匹配的任何子字符串都被打印到outfile中(使用此处的示例,如果> name3在集合num中,则将打印以> name3以及> name31和> name367开头的行)
此问题可以通过两种方法解决。
只需添加空间。
如果您确定在“关键字”之后留有空格,则可以添加只需添加空格。
示例:
if any(word + " " in line for word in nums):
正则表达式。
要解决此问题,可以使用正则表达式。您应该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:
遍历文件,该文件逐行读取文件。如果要打印下一行,可以使用几种方法。
布尔型标志。
要实现此目的,您应在循环前声明布尔值并将其设置为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
将循环从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
"""