7

という名前のテキスト ファイルがありますtest.txt。私はそれを読んで、ファイルからすべての単語 (改行を削除したもの) のリストを返したいと思っています。

これは私の現在のコードです:

def read_words(test.txt):
    open_file = open(words_file, 'r')
    words_list =[]
    contents = open_file.readlines()
    for i in range(len(contents)):
         words_list.append(contents[i].strip('\n'))
    return words_list    
    open_file.close()  

このコードを実行すると、次のリストが生成されます。

['hello there how is everything ', 'thank you all', 'again', 'thanks a lot']

リストを次のようにしたい:

['hello','there','how','is','everything','thank','you','all','again','thanks','a','lot']
4

5 に答える 5

20

ファイルのサイズにもよりますが、これは次のように簡単なようです。

with open(file) as f:
    words = f.read().split()
于 2012-11-06T21:21:12.543 に答える
14

words_list.append(...)for ループの行を次のように置き換えます。

words_list.extend(contents[i].split())

これにより、各行が空白文字で分割され、結果のリストの各要素が に追加されwords_listます。

または、関数全体をリスト内包表記として書き換える別の方法として:

def read_words(words_file):
    return [word for line in open(words_file, 'r') for word in line.split()]
于 2012-11-06T21:00:26.557 に答える
5

これが私がそれを書く方法です:

def read_words(words_file):
  with open(words_file, 'r') as f:
    ret = []
    for line in f:
      ret += line.split()
    return ret

print read_words('test.txt')

この関数は を使用して多少短縮できますがitertools、個人的には結果が読みにくいと感じています。

import itertools

def read_words(words_file):
  with open(words_file, 'r') as f:
    return list(itertools.chain.from_iterable(line.split() for line in f))

print read_words('test.txt')

2 番目のバージョンの優れた点は、完全にジェネレーター ベースにすることができるため、ファイルのすべての単語を一度にメモリに保持することを回避できることです。

于 2012-11-06T21:06:47.757 に答える
3

これを行うにはいくつかの方法があります。ここにいくつかあります:

繰り返される単語を気にしない場合

def getWords(filepath):
    with open('filepath') as f:
        return list(itertools.chain(line.split() for line in f))

各単語が1回だけ出現する単語のリストを返したい場合

注:これは単語の順序を保持しません

def getWords(filepath):
    with open('filepath') as f:
        return {word for word in line.split() for line in f} # python2.7
        return set((word for word in line.split() for line in f)) # python 2.6

セットが必要な場合-そして-語順を維持したい場合

def getWords(filepath):
    with open('filepath') as f:
        words = []
        pos = {}
        position = itertools.count()
        for line in f:
            for word in line.split():
                if word not in pos:
                    pos[word] = position.next()
                        words.append(word)
    return sorted(words, key=pos.__getitem__)

単語頻度辞書が必要な場合

def getWords(filepath):
    with open('filepath') as f:
        return collections.Counter(itertools.chain(line.split() for line in file))

これらの助けを願っています

于 2012-11-06T21:34:08.350 に答える