2012-11-06 4 views
7

Ich habe eine Textdatei mit dem Namen test.txt. Ich möchte es lesen und eine Liste aller Wörter (mit entfernten Zeilenumbrüchen) aus der Datei zurückgeben.Rückgabe einer Liste von Wörtern nach dem Lesen einer Datei in Python

Dies ist meine aktuellen Code:

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() 

diesen Code Lauf erzeugt diese Liste:

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

ich die Liste wollen wie folgt aussehen:

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

http://docs.python.org/2/library/stdtypes.html#str.split – kreativitea

Antwort

13

Ersetzen Sie die words_list.append(...) Linie in der for-Schleife mit den folgenden:

Dadurch wird jede Zeile in Whitespace-Zeichen aufgeteilt und dann jedes Element der resultierenden Liste zu words_list hinzugefügt.

oder als alternative Methode für die gesamte Funktion als Liste Verständnis Umschreiben:

def read_words(words_file): 
    return [word for line in open(words_file, 'r') for word in line.split()] 
+0

danke F.J, das war nützlich –

5

Hier ist, wie ich das schreiben würde:

kann
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') 

Die Funktion unter Verwendung verkürzt werden etwas itertools, aber ich persönlich finde das Ergebnis weniger lesbar:

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') 

Das Schöne an der zweiten Version ist, dass sie vollständig generatorbasiert sein kann und somit verhindert, dass alle Wörter der Datei gleichzeitig im Speicher bleiben.

17

Je nach Größe der Datei, erscheint dies wie es so einfach sein würde, wie:

with open(file) as f: 
    words = f.read().split() 
+1

+1, weil es Consise ist und auf den Punkt. –

3

Es gibt mehrere Möglichkeiten, dies zu tun. Hier sind ein paar:

Wenn Sie nicht über wiederholte Worte egal:

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

Wenn Sie eine Liste von Wörtern zurückkehren wollen, in dem jedes Wort nur einmal erscheint:

Hinweis: diese erhalten nicht die Reihenfolge der Wörter

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 

Wenn Sie ein Set --and-- wollen wollen die Reihenfolge der Wörter bewahren: Hoffnung

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

diese helfen

:

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__) 

Wenn Sie ein Wort Frequenz Wörterbuch wollen

Verwandte Themen