Ich habe diese Textdatei aus Zahlen und Wörtern, zum Beispiel wie folgt - 09807754 18 n 03 aristocrat 0 blue_blood 0 patrician, und ich möchte sie so aufteilen, dass jedes Wort oder jede Zahl als neue Zeile angezeigt wird.

Ein Leerzeichen-Trennzeichen wäre ideal, da ich möchte, dass die Wörter mit den Bindestrichen in Verbindung bleiben.

Das habe ich bisher:

f = open('words.txt', 'r')
for word in f:
    print(word)

Ich bin mir nicht sicher, wie ich von hier aus vorgehen soll. Ich möchte, dass dies die Ausgabe ist:

09807754
18
n
3
aristocrat
...
59
Johnnerz 4 Juni 2013 im 19:50

6 Antworten

Beste Antwort

Angesichts dieser Datei:

$ cat words.txt
line1 word1 word2
line2 word3 word4
line3 word5 word6

Wenn Sie jeweils nur ein Wort möchten (ohne Berücksichtigung der Bedeutung von Leerzeichen und Zeilenumbrüchen in der Datei):

with open('words.txt','r') as f:
    for line in f:
        for word in line.split():
           print(word)    

Drucke:

line1
word1
word2
line2
...
word6 

Wenn Sie die Datei in eine einzige flache Liste von Wörtern in der Datei reduzieren möchten, können Sie dies auch tun ::

with open('words.txt') as f:
    flat_list=[word for line in f for word in line.split()]

>>> flat_list
['line1', 'word1', 'word2', 'line2', 'word3', 'word4', 'line3', 'word5', 'word6']

Welches kann die gleiche Ausgabe wie das erste Beispiel mit print '\n'.join(flat_list) erstellen ...

Oder wenn Sie eine verschachtelte Liste der Wörter in jeder Zeile der Datei wünschen (z. B. um eine Matrix aus Zeilen und Spalten aus einer Datei zu erstellen):

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

>>> matrix
[['line1', 'word1', 'word2'], ['line2', 'word3', 'word4'], ['line3', 'word5', 'word6']]

Wenn Sie eine Regex-Lösung wünschen, mit der Sie wordN vs lineN -Wörter in der Beispieldatei filtern können:

import re
with open("words.txt") as f:
    for line in f:
        for word in re.findall(r'\bword\d+', line):
            # wordN by wordN with no lineN

Oder wenn Sie möchten, dass dies ein zeilenweiser Generator mit einem regulären Ausdruck ist:

 with open("words.txt") as f:
     (word for line in f for word in re.findall(r'\w+', line))
135
dawg 19 Dez. 2019 im 16:54
f = open('words.txt')
for word in f.read().split():
    print(word)
18
dugres 13 Juli 2014 im 08:59

Hier ist mein voll funktionsfähiger Ansatz, bei dem es vermieden wird, Zeilen zu lesen und zu teilen. Es verwendet das itertools Modul:

Hinweis für Python 3, ersetzen Sie itertools.imap durch map

import itertools

def readwords(mfile):
    byte_stream = itertools.groupby(
        itertools.takewhile(lambda c: bool(c),
            itertools.imap(mfile.read,
                itertools.repeat(1))), str.isspace)

    return ("".join(group) for pred, group in byte_stream if not pred)

Beispielnutzung:

>>> import sys
>>> for w in readwords(sys.stdin):
...     print (w)
... 
I really love this new method of reading words in python
I
really
love
this
new
method
of
reading
words
in
python

It's soo very Functional!
It's
soo
very
Functional!
>>>

Ich denke in Ihrem Fall wäre dies der Weg, um die Funktion zu verwenden:

with open('words.txt', 'r') as f:
    for word in readwords(f):
        print(word)
0
smac89 29 Nov. 2016 im 05:56

Als Ergänzung, Wenn Sie eine sehr große Datei lesen und nicht den gesamten Inhalt auf einmal in den Speicher lesen möchten, können Sie einen Puffer verwenden und dann jedes Wort nach Ausbeute zurückgeben:

def read_words(inputfile):
    with open(inputfile, 'r') as f:
        while True:
            buf = f.read(10240)
            if not buf:
                break

            # make sure we end on a space (word boundary)
            while not str.isspace(buf[-1]):
                ch = f.read(1)
                if not ch:
                    break
                buf += ch

            words = buf.split()
            for word in words:
                yield word
        yield '' #handle the scene that the file is empty

if __name__ == "__main__":
    for word in read_words('./very_large_file.txt'):
        process(word)
13
Featherlegs 25 Mai 2017 im 19:41
with open(filename) as file:
    words = file.read().split()

Es ist eine Liste aller Wörter in Ihrer Datei.

import re
with open(filename) as file:
    words = re.findall(r"([a-zA-Z\-]+)", file.read())
2
mujad 20 Jän. 2019 im 08:38

Was Sie tun können, ist, mit nltk Wörter zu tokenisieren und dann alle Wörter in einer Liste zu speichern. Hier ist, was ich getan habe. Wenn Sie nltk nicht kennen; Es steht für Natural Language Toolkit und wird zur Verarbeitung natürlicher Sprache verwendet. Hier ist eine Ressource, wenn Sie loslegen möchten [http://www.nltk.org/book/]

import nltk 
from nltk.tokenize import word_tokenize 
file = open("abc.txt",newline='')
result = file.read()
words = word_tokenize(result)
for i in words:
       print(i)

Die Ausgabe lautet wie folgt:

09807754
18
n
03
aristocrat
0
blue_blood
0
patrician
3
Gaurav 24 März 2018 im 11:37