1

ループで書き込みを行っているログファイルで、最初に一致した単語と ln のみを取得する理由がわかりません (50 件以上の一致があります)。そして、画面に印刷するときのように構造化されていません。以下はコードです。ありがとう!

私が書いているファイルの結果:343438363939 70642

regex = re.compile(r'(?:3\d){6}')
for root,dirname, files in os.walk(directory):
    for file in files:
        if file.endswith(".log") or file.endswith(".txt"):
            f = open(os.path.join(root,file))
                for i, line in enumerate(f.readlines()):
                    searchedstr = regex.findall(line)
                    ln = str(i)
                    for word in searchedstr:
                         print "\nString found: " + word
                         print "Line: " + ln
                         print "File: " + os.path.join(root,file)
                         print " "
                         logfile = open('result3.log', 'w')
                         logfile.write(word + '\n' + ln)
                         logfile.close()
            f.close()
4

2 に答える 2

4

これはあなたの問題です:

                 logfile = open('result3.log', 'w')
                 logfile.write(word + '\n' + ln)
                 logfile.close()

このようにログファイルを開くたびに、以前にあったものはすべて消去され、ファイルの最初から書き込みが開始されます。を次のいずれかに変更できますopen

                 logfile = open('result3.log', 'a')

('a' は 'append' を表します)、または -- より良い --logfile次のように、最も外側のループの外側で 1 回だけ開きます。

regex = re.compile(r'(?:3\d){6}')
with open('result3.log', 'w') as logfile:
    for root, dirname, files in os.walk(directory):
        # ...
        logfile.write(word + '\n' + ln)

withがファイルを閉じてくれるので、明示的な は必要ありませんlogfile.close()。(ネストされたループの下に がぶら下がっていない限り、 a を使用しwithて開く方が良いスタイルです。) (さらに補遺:は遅い以外は同じです。)ff.close()enumerate(f.readlines())enumerate(f)

于 2011-05-03T16:57:30.403 に答える
2

追加では'w'なくで開くため、出力ファイルに書き込むたびに出力ファイルを上書きしています。'a'

たぶん、ループの外で一度開く必要があります。

于 2011-05-03T16:57:27.860 に答える