Anzahl von Wörtern in String zählen
Verfasst: Montag 13. Mai 2013, 15:14
Kann mir jemand sagen wie ich die anzahl von Wörtern in einem String zählen kann?
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
fileName = "Dein String, Deine Textdatei"
num_lines = 0
num_words = 0
num_chars = 0
with open(fileName, 'r') as f:
for line in f:
words = line.split()
num_lines += 1
num_words += len(words)
num_chars += len(line)
print "Anzahl Zeilen: ", num_lines
print "Anzahl Wörter: ", num_words
print "Anzahl Buchstaben: ", num_chars
Code: Alles auswählen
from collections import Counter
with open("test.txt") as f:
counts = Counter(f.read().split())
print counts
Code: Alles auswählen
import re
s = " Hallo Welt, das ist ein Test! "
sum(1 for space in re.finditer(r"[^\s]+", s))
> 6
Code: Alles auswählen
re.sub(r'\w+', 'x', text).count('x')
Ah sieh an... hätte ich nicht gedacht. (Ich nehme an Du meintest meine Variante?) Wie sieht es denn mit Deiner aus?Sirius3 hat geschrieben:Und die Variante über reguläre Ausdrücke ist rund 6mal langsamer.
Code: Alles auswählen
import re
for x in range(0,100):
with open ('test.txt', 'r') as f:
print(sum(1 for space in re.finditer(r"[\S]+", f.read())))
Code: Alles auswählen
import re
for x in range(0,100):
with open ('test.txt', 'r') as f:
print(sum(1 for space in re.finditer(r"[^\s]+", f.read())))
Code: Alles auswählen
from collections import Counter
for x in range(0,100):
with open('test.txt') as f:
counts = Counter(f.read().split())
print(counts)
Code: Alles auswählen
for x in range(0,100):
with open('test.txt', 'r') as f:
print(len(f.read().split()))
Ich denke alle 4 von mir getesteten Implementierungen haben Probleme beim Speicherbedarf, andreseits wer hat schon Textdateien > 50MB? Das dürfte wohl eher die Ausnahme darstellen.cofi hat geschrieben:Wobei hier alle Loesungen ein potentielles Problem mit richtig grossen Dateien haben. Vor allem 4, da hier zeitweise das doppelte der Dateigroesse an Speicher benoetigt wird.
Code: Alles auswählen
with open('test.txt') as f:
print(reduce(
lambda (s,b),c: (s+(b and b!=c.isspace()), c.isspace()),
iter(lambda: f.read(1), ''), (0,1))[0])
Log-Dateien werden für gewöhnlich nicht größer als 10MB (Erfahrungswert), selbst auf meinen Server finde ich dank logrotate keine einzige Logdatei > 3MB.cofi hat geschrieben:Aber nur das 4. belegt zeitweise das doppelte an Speicherplatz. Wer so grosse Textdateien hat? Jemand der Log-Dateien hat, und das ist nur einer von vielen Faellen ..
JohnDoe hat geschrieben: Meine kleine Liste mit Passwörtern hat knapp 30000 Einträge und selbst die belegt nicht mehr als 300kB.
mfg
Code: Alles auswählen
Anzahl Zeilen: 4'103'549'346
Anzahl Wörter: 4'103'549'346
Anzahl Buchstaben: 24'541'533'232
Code: Alles auswählen
Anzahl Zeilen: 3917193
Anzahl Wörter: 4101726
Anzahl Buchstaben: 43391014
Es geht mir nicht darum ob es Logdateien gibt die größer sind als 50MB und es geht mir auch nicht darum, ob es Rechner gibt die weniger als 1GB RAM haben. Wenn man, wie @lackschuh, eine Passwortliste mit 20GB rumschleppt, dann lohnt es sich das Programm so zu erweitern, dass es mit der Datenmenge klarkommt. Ansonsten: Optimierungen immer erst dann anwenden, wenn es nötig ist.BlackJack hat geschrieben:Ich kenne grössere Logdateien. Und auch Textdateien mit Messungen die deutlich grösser sind. Auf der anderen Seite kenne ich auch Rechner die nicht mehrere GiB RAM haben.
Code: Alles auswählen
def count_words(stream, chunk_size=1024*1024):
num_words = 0
saw_nonspace = False
chunk_reader = iter(lambda: stream.read(chunk_size), '')
for chunk in chunk_reader:
num_chunk_words = len(chunk.split())
if saw_nonspace and not chunk[0].isspace():
num_chunk_words -= 1
num_words += num_chunk_words
saw_nonspace = not chunk[-1].isspace()
return num_words
def test():
from StringIO import StringIO
s = StringIO(" as s s s ")
print count_words(s, 2)
if __name__ == '__main__':
test()