1

list.txtにリストされている文字列(1行に1文字列)を別のテキストファイルで検索したいのですが、「string、another_sentence」が見つからなかった場合は「string、one_sentence」と出力されます。次のコードを使用していますが、ファイルlist.txtから文字列リストの最後の文字列のみが検索されています。何が原因なのか理解できませんか?

data = open('c:/tmp/textfile.TXT').read()
for x in open('c:/tmp/list.txt').readlines():
    if x in data:
        print(x,',one_sentence')
    else:
        print(x,',another_sentence')
4

2 に答える 2

5

を含むファイルを読み取るとreadlines()、結果のリスト要素には末尾の改行文字が含まれます。おそらく、これらが予想よりも一致数が少ない理由です。

書く代わりに

for x in list:

書きます

for x in (s.strip() for s in list):

これにより、の文字列から先頭と末尾の空白が削除されlistます。したがって、文字列から末尾の改行文字を削除します。

プログラムを統合するために、次のようなことを行うことができます。

with open('c:/tmp/textfile.TXT') as f:
    haystack = f.read()

if not haystack:
    sys.exit("Could not read haystack data :-(")

with open('c:/tmp/list.txt') as f:
    for needle in (line.strip() for line in f):
        if needle in haystack:
            print(needle, ',one_sentence')
        else:
            print(needle, ',another_sentence')

あまり大幅な変更はしたくありませんでした。最も重要な違いは、ここでwithステートメントを介してコンテキストマネージャーを使用していることです。それはあなたのために適切なファイル処理(主に閉じる)を保証します。また、「needle」行は、ジェネレータ式を使用してオンザフライで削除されます。上記のアプローチでは、ファイル全体を一度にメモリにロードするのではなく、ニードルファイルを1行ずつ読み取って処理します。もちろん、これは大きなファイルの場合にのみ違いがあります。

于 2012-09-11T13:08:08.687 に答える
0

readlines()は、リストファイルから読み取られた各文字列の最後に改行文字を保持します。それらの文字列に対してstrip()を呼び出して、それらの(および他のすべての空白)文字を削除します。

于 2012-09-11T13:16:22.420 に答える