Python 匹配两个文件中的数据
我正在尝试匹配两个文件中的网络登录用户名。“全部”是我感兴趣或将感兴趣匹配的名称的文本文件。目前,我正在做这样的事情:Python 匹配两个文件中的数据,python,readlines,Python,Readlines,我正在尝试匹配两个文件中的网络登录用户名。“全部”是我感兴趣或将感兴趣匹配的名称的文本文件。目前,我正在做这样的事情: 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
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_文件中的目录;已向os.walk传递了目录名。fnmatch模块还有一个.filter方法,使用该方法循环文件,而不是单独对每个文件使用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)
您希望先将一个文件读入内存,并将其存储在一个集合中。在一个集合中进行成员资格测试是非常有效的,比在第一个文件的每一行上循环第二个文件的行要有效得多
然后您只需要读取第二个文件,逐行处理它并测试行是否匹配
内存中保存的文件取决于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_文件中的目录;已向os.walk传递了目录名。fnmatch模块还有一个.filter方法,使用该方法循环文件,而不是单独对每个文件使用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)