gpt4 book ai didi

python - 匹配两个文件中的数据

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:07 25 4
gpt4 key购买 nike

我试图在两个文件中匹配(什么是网络登录用户名)。 All 是我(或将)有兴趣匹配的名称的文本文件。目前,我正在做这样的事情:

def find_files(directory, pattern):
#directory= (raw_input("Enter a directory to search for Userlists: ")
directory=("c:\\TEST")
os.chdir(directory)
for root, dirs, files in os.walk(directory):
for basename in files:
if fnmatch.fnmatch(basename, pattern):
filename = os.path.join(root, basename)
yield filename


for filename in find_files('a-zA-Z0-9', '*.txt'):
with open (filename, "r") as file1:
with open ("c:/All.txt", "r") as file2:
list1 = file1.readlines()[18:]
list2 = file2.readlines()
for i in list1:
for j in list2:
if i == j:

我是 python 的新手,想知道这是否是最好、最有效的方法。看起来,对我来说,即使是一个新手也有点笨拙,但以我目前的编码知识,这是我目前能想到的最好的。如有任何帮助和建议,我们将不胜感激。

最佳答案

您想先将一个 文件读入内存,然后将其存储在一个集合中。集合中的成员资格测试非常有效,比针对第一个文件中的每一行遍历第二个文件的行要高效得多。

然后你只需要读取第二个文件,逐行处理并测试行是否匹配。

您在内存中保留什么文件取决于 All.txt 的大小。如果它小于 1000 行左右,只需将其保存在内存中并将其与其他文件进行比较。如果 All.txt 非常大,则为您处理的每个 file1 重新打开它,并且只将 file1 的前 18 行读入内存并逐行匹配 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)

关于python - 匹配两个文件中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16582969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com