8

次のような 1 つの [*] 単語/行を含むファイルから行を読み取っています。

dog
cat
person
tree

これらの各単語には、改行\n文字も含まれています。それらをリストに読み込んで改行を捨てたい。私が考案したreadlines()方法は、リストを読み取ってからstrip()改行に処理することです。

with open('words.txt') as f:
    words = f.readlines()

for index, word in enumerate(words):
    words[index] = word.strip()

これは問題なく機能しますが、読み取りプロセス中に改行を削除する、これを行うためのより効率的な方法があると思わずにはいられません。しかし、私は方法を見つけることができません。もっと効率的なものはありますか(読みやすさなども考慮しながら)

[*] 更新: 一部の行には複数の単語が含まれる可能性があることに言及する必要がありましたが、その場合、1 行に多くの単語が含まれていても、1 つのリスト項目に入れる必要があります。これまでのところ、どちらの回答もこれを処理していますが(自分のコードと同様)、言及したかったのです。

4

4 に答える 4

15

リスト内包表記を使用できます:

with open('words.txt') as f:
    words = [word.strip() for word in f]
于 2013-09-18T06:24:57.590 に答える
5

使用できますmap

with open('words.txt') as f:
   words = map(str.rstrip, f)
于 2013-09-18T06:24:15.370 に答える
2

次のように書くこともできます( EOL 文字を削除する以上のことを行うlines = [s.rstrip("\n\r") for s in f.readlines()]のは だけではないことに注意してください)。strip

ただし、ファイルが大きい場合は、次のように、ファイル全体をロードするのではなく、ループ内の各行を処理する必要があります。

while True:
    s = f.readline()
    if s == "":
        break   # end of file
    line = s.rstrip("\n\r")
    ...
于 2013-09-18T06:30:02.973 に答える
2

1 行に複数の単語を処理するには、行を分割することをお勧めします。

with open('words.txt') as f:
    result = [words.strip().split() for words in f]

これにより、リストのリストが作成されますが、そのほとんどは 1 つの要素の長さです。たとえば、これを行うことができます。

for words in result:
    print len(words)
于 2013-09-18T06:49:40.817 に答える