亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

匹配兩個文件中的數據

匹配兩個文件中的數據

繁星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條經驗 獲得超5個贊

您想先將一個文件讀入內存,然后將其存儲在一個文件集中。集合中的成員資格測試非常有效,遠比為第一個文件中的每一行循環遍歷第二個文件的行要有效得多。


然后,您只需要讀取第二個文件,然后逐行處理它并測試行是否匹配。


您保存在內存中的文件取決于的大小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 關注
  • 282 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號