猿问

匹配两个文件中的数据

我正在尝试在两个文件中匹配(什么是网络登录用户名)。全部是一个我想(或将要)匹配名称的文本文件。目前,我正在执行以下操作:


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的新手,我想知道这是否是最好,最有效的方法。在我看来,即使是新手也有些笨拙,但是根据我目前的编码知识,这是我目前能提供的最好的知识。任何帮助和建议将不胜感激。


繁星coding
浏览 256回答 1
1回答

收到一只叮咚

您想先将一个文件读入内存,然后将其存储在一个文件集中。集合中的成员资格测试非常有效,远比为第一个文件中的每一行循环遍历第二个文件的行要有效得多。然后,您只需要读取第二个文件,然后逐行处理它并测试行是否匹配。您保存在内存中的文件取决于的大小All.txt。如果它小于1000行,只需将其保留在内存中,然后将其与其他文件进行比较即可。如果All.txt确实很大,请为file1您的每个处理过程重新打开它,然后仅将其的前18行读file1入内存,并将它们与中的每一行进行All.txt逐行匹配。要仅读取文件的18行,请使用itertools.islice();文件是可迭代的,并且islice()是选择要读取的行的子集的最简单方法。All.txt首先读入内存:from itertools import islicewith 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)
随时随地看视频慕课网APP

相关分类

Python
我要回答