在多个文本文件中搜索两个字符串?
Searching multiple text files for two strings?
我有一个包含许多文本文件的文件夹(EPA10.txt、EPA55.txt、EPA120.txt...、EPA150.txt)。我有 2 个字符串要在每个文件中搜索,搜索结果写在文本文件 result.txt 中。到目前为止,我让它为单个文件工作。这是工作代码:
if 'LZY_201_335_R10A01' and 'LZY_201_186_R5U01' in open('C:\Temp\lamip\EPA150.txt').read():
with open("C:\Temp\lamip\result.txt", "w") as f:
f.write('Current MW in node is EPA150')
else:
with open("C:\Temp\lamip\result.txt", "w") as f:
f.write('NOT EPA150')
现在我希望对文件夹中的所有文本文件重复此操作。请帮忙。
鉴于你有一些EPA1.txt
到EPA150.txt
的文件,但你不知道所有的名字,你可以把它们放在一个文件夹里,然后读取所有的文件该文件夹中的文件使用 os.listdir()
方法获取文件名列表。您可以使用 listdir("C:/Temp/lamip")
.
读取文件名
此外,您的 if
陈述是错误的,您应该这样做:
text = file.read()
if "string1" in text and "string2" in text
代码如下:
from os import listdir
with open("C:/Temp/lamip/result.txt", "w") as f:
for filename in listdir("C:/Temp/lamip"):
with open('C:/Temp/lamip/' + filename) as currentFile:
text = currentFile.read()
if ('LZY_201_335_R10A01' in text) and ('LZY_201_186_R5U01' in text):
f.write('Current MW in node is ' + filename[:-4] + '\n')
else:
f.write('NOT ' + filename[:-4] + '\n')
PS:您可以在路径中使用 /
而不是 \
,Python 会自动为您转换它们。
您可以通过创建一个遍历当前工作目录中所有 .txt
文件的 for
循环来实现。
import os
with open("result.txt", "w") as resultfile:
for result in [txt for txt in os.listdir(os.getcwd()) if txt.endswith(".txt")]:
if 'LZY_201_335_R10A01' and 'LZY_201_186_R5U01' in open(result).read():
resultfile.write('Current MW in node is {1}'.format(result[:-4]))
else:
resultfile.write('NOT {0}'.format(result[:-4]))
模块化! 模块化!
好吧,不是说必须编写不同的 Python 模块,而是将手头的不同任务隔离开来。
- 找到您要搜索的文件。
- 读取文件并找到文本。
- 将结果写入单独的文件。
这些任务中的每一个都可以独立解决。 IE。要列出文件,您有 os.listdir
个可能要过滤的文件。
对于第 2 步,搜索 1 个或 1,000 个文件都没有关系。套路是一样的。您只需遍历步骤 1 中找到的每个文件。这表明步骤 2 可以作为一个函数来实现,该函数将文件名(和可能的搜索字符串)作为参数,并且 returns True
或False
.
第 3 步是第 1 步的每个元素与第 2 步的结果的组合。
结果:
files = [fn for fn in os.listdir('C:/Temp/lamip') if fn.endswith('.txt')]
# perhaps filter `files`
def does_fn_contain_string(filename):
with open('C:/Temp/lamip/' + filename) as blargh:
content = blargh.read()
return 'string1' in content and/or 'string2' in content
with open('results.txt', 'w') as output:
for fn in files:
if does_fn_contain_string(fn):
output.write('Current MW in node is {1}\n'.format(fn[:-4]))
else:
output.write('NOT {1}\n'.format(fn[:-4]))
我有一个包含许多文本文件的文件夹(EPA10.txt、EPA55.txt、EPA120.txt...、EPA150.txt)。我有 2 个字符串要在每个文件中搜索,搜索结果写在文本文件 result.txt 中。到目前为止,我让它为单个文件工作。这是工作代码:
if 'LZY_201_335_R10A01' and 'LZY_201_186_R5U01' in open('C:\Temp\lamip\EPA150.txt').read():
with open("C:\Temp\lamip\result.txt", "w") as f:
f.write('Current MW in node is EPA150')
else:
with open("C:\Temp\lamip\result.txt", "w") as f:
f.write('NOT EPA150')
现在我希望对文件夹中的所有文本文件重复此操作。请帮忙。
鉴于你有一些EPA1.txt
到EPA150.txt
的文件,但你不知道所有的名字,你可以把它们放在一个文件夹里,然后读取所有的文件该文件夹中的文件使用 os.listdir()
方法获取文件名列表。您可以使用 listdir("C:/Temp/lamip")
.
此外,您的 if
陈述是错误的,您应该这样做:
text = file.read()
if "string1" in text and "string2" in text
代码如下:
from os import listdir
with open("C:/Temp/lamip/result.txt", "w") as f:
for filename in listdir("C:/Temp/lamip"):
with open('C:/Temp/lamip/' + filename) as currentFile:
text = currentFile.read()
if ('LZY_201_335_R10A01' in text) and ('LZY_201_186_R5U01' in text):
f.write('Current MW in node is ' + filename[:-4] + '\n')
else:
f.write('NOT ' + filename[:-4] + '\n')
PS:您可以在路径中使用 /
而不是 \
,Python 会自动为您转换它们。
您可以通过创建一个遍历当前工作目录中所有 .txt
文件的 for
循环来实现。
import os
with open("result.txt", "w") as resultfile:
for result in [txt for txt in os.listdir(os.getcwd()) if txt.endswith(".txt")]:
if 'LZY_201_335_R10A01' and 'LZY_201_186_R5U01' in open(result).read():
resultfile.write('Current MW in node is {1}'.format(result[:-4]))
else:
resultfile.write('NOT {0}'.format(result[:-4]))
模块化! 模块化!
好吧,不是说必须编写不同的 Python 模块,而是将手头的不同任务隔离开来。
- 找到您要搜索的文件。
- 读取文件并找到文本。
- 将结果写入单独的文件。
这些任务中的每一个都可以独立解决。 IE。要列出文件,您有 os.listdir
个可能要过滤的文件。
对于第 2 步,搜索 1 个或 1,000 个文件都没有关系。套路是一样的。您只需遍历步骤 1 中找到的每个文件。这表明步骤 2 可以作为一个函数来实现,该函数将文件名(和可能的搜索字符串)作为参数,并且 returns True
或False
.
第 3 步是第 1 步的每个元素与第 2 步的结果的组合。
结果:
files = [fn for fn in os.listdir('C:/Temp/lamip') if fn.endswith('.txt')]
# perhaps filter `files`
def does_fn_contain_string(filename):
with open('C:/Temp/lamip/' + filename) as blargh:
content = blargh.read()
return 'string1' in content and/or 'string2' in content
with open('results.txt', 'w') as output:
for fn in files:
if does_fn_contain_string(fn):
output.write('Current MW in node is {1}\n'.format(fn[:-4]))
else:
output.write('NOT {1}\n'.format(fn[:-4]))