2012-11-06 11 views
7

Mam plik tekstowy o nazwie test.txt. Chcę go przeczytać i zwrócić listę wszystkich słów (z usuniętymi znakami nowej linii) z pliku.zwraca listę słów po przeczytaniu pliku w pythonie

To jest mój bieżący kod:

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

Uruchomienie tego kodu produkuje tę listę:

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

Chcę listę, aby wyglądać tak:

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

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

Odpowiedz

13

Wymień words_list.append(...) linia w pętli for z następującym kodem:

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

Spowoduje to podział każdej linii na znaki odstępu, a następnie doda każdy element z listy wynikowej do words_list.

Albo jako alternatywnego sposobu przepisywania całą funkcję jako listowego:

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

dziękuję F.J, to było przydatne –

5

Oto jak bym napisać, że:

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

Funkcję tę można nieco skrócić stosując itertools, ale ja osobiście uważam wynik za mniej czytelny:

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

Fajną cechą drugiej wersji jest to, że można ją w całości generować na podstawie generatora, przez co unika się przechowywania wszystkich słów pliku w pamięci jednocześnie.

17

W zależności od rozmiaru pliku, to wydaje się, że będzie tak łatwe, jak:

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

+1, ponieważ jest to konsystencja i do rzeczy. –

3

Istnieje kilka sposobów, aby to zrobić. Oto kilka z nich:

Jeśli nie dbają o powtarzających się słów:

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

Jeśli chcesz powrócić listę słów, w której każde słowo pojawia się tylko raz:

Uwaga: to nie zachowuje kolejność wyrazów

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 

Jeśli chcesz zestaw --and-- chcesz zachować kolejność słów:

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

Jeśli chcesz słownika słowo częstotliwości:

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

nadzieję, że te pomogą

Powiązane problemy