为了账号安全,请及时绑定邮箱和手机立即绑定

匹配两个文件中的数据

匹配两个文件中的数据

繁星coding 2021-03-11 14:08:58
我正在尝试在两个文件中匹配(什么是网络登录用户名)。全部是一个我想(或将要)匹配名称的文本文件。目前,我正在执行以下操作: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 filenamefor 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的新手,我想知道这是否是最好,最有效的方法。在我看来,即使是新手也有些笨拙,但是根据我目前的编码知识,这是我目前能提供的最好的知识。任何帮助和建议将不胜感激。
查看完整描述

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)


查看完整回答
反对 回复 2021-03-24
  • 1 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信