1 回答
TA贡献1821条经验 获得超4个赞
您想先将一个文件读入内存,然后将其存储在一个文件集中。集合中的成员资格测试非常有效,远比为第一个文件中的每一行循环遍历第二个文件的行要有效得多。
然后,您只需要读取第二个文件,然后逐行处理它并测试行是否匹配。
您保存在内存中的文件取决于的大小All.txt。如果它小于1000行,只需将其保留在内存中,然后将其与其他文件进行比较即可。如果All.txt确实很大,请为file1您的每个处理过程重新打开它,然后仅将其的前18行读file1入内存,并将它们与中的每一行进行All.txt逐行匹配。
要仅读取文件的18行,请使用itertools.islice();文件是可迭代的,并且islice()是选择要读取的行的子集的最简单方法。
All.txt首先读入内存:
from itertools import islice
with open ("c:/All.txt", "r") as all:
# storing lines without whitespace to make matching a little more robust
all_lines = set(line.strip() for line in all)
for filename in find_files('a-zA-Z0-9', '*.txt'):
with open(filename, "r") as file1:
for line in islice(file1, 18):
if line.strip() in all_lines:
# matched line
如果All.txt很大,请先将每个文件的那18行存储在一个集中,然后重新打开All.txt并逐行处理:
for filename in find_files('a-zA-Z0-9', '*.txt'):
with open(filename, "r") as file1:
file1_lines = set(line.strip() for line in islice(file1, 18))
with open ("c:/All.txt", "r") as all:
for line in all:
if line.strip() in file1_lines:
# matched line
请注意,你不会有更改目录中find_files(); os.walk()已经传递了目录名称。该fnmatch模块还有一个.filter()方法,使用该方法可以循环files而不是fnmatch.fnmatch()单独在每个文件上使用:
def find_files(directory, pattern):
directory = "c:\\TEST"
for root, dirs, files in os.walk(directory):
for basename in fnmatch.filter(files, pattern):
yield os.path.join(root, basename)
添加回答
举报