Hier ist die Frage:
Ich habe eine Datei mit diesen Wörtern:
hey how are you
I am fine and you
Yes I am fine
Und es wird nach der Anzahl der Wörter, Zeilen und Zeichen gefragt.
Unten ist mein Programm, aber die Anzahl der Zählungen für die Zeichen ohne Leerzeichen stimmt nicht.
Die Anzahl der Wörter ist korrekt und die Anzahl der Zeilen ist richtig .. Was ist der Fehler in derselben Schleife?
fname = input("Enter the name of the file:")
infile = open(fname, 'r')
lines = 0
words = 0
characters = 0
for line in infile:
wordslist = line.split()
lines = lines + 1
words = words + len(wordslist)
characters = characters + len(line)
print(lines)
print(words)
print(characters)
Die Ausgabe ist:
lines=3(Correct)
words=13(correct)
characters=47
Ich habe auf der Website mit mehreren Antworten nachgesehen und bin verwirrt, weil ich in Python keine anderen Funktionen gelernt habe. Wie korrigiere ich den Code so einfach und grundlegend wie in der Schleife, die ich durchgeführt habe?
Während die Anzahl der Zeichen ohne Leerzeichen 35 und mit Leerzeichen 45 .. ist, möchte ich die Anzahl der Zeichen ohne Leerzeichen ermitteln. Selbst wenn jemand die Schleife für die Anzahl der Zeichen mit Leerzeichen kennt, ist das in Ordnung.
Zählen Sie die Länge aller Wörter in einer Zeile zusammen:
characters += sum(len(Word) for Word in wordslist)
Das ganze Programm:
with open('my_words.txt') as infile:
lines=0
words=0
characters=0
for line in infile:
wordslist=line.split()
lines=lines+1
words=words+len(wordslist)
characters += sum(len(Word) for Word in wordslist)
print(lines)
print(words)
print(characters)
Ausgabe:
3
13
35
Diese:
(len(Word) for Word in wordslist)
ist ein Generator Ausdruck . Es ist im Wesentlichen eine Schleife in einer Zeile, die die Länge jedes Wortes erzeugt. Wir geben diese Längen direkt an sum
weiter:
sum(len(Word) for Word in wordslist)
Diese Version nutzt enumerate
, sodass Sie zwei Codezeilen speichern und die Lesbarkeit beibehalten:
with open('my_words.txt') as infile:
words = 0
characters = 0
for lineno, line in enumerate(infile, 1):
wordslist = line.split()
words += len(wordslist)
characters += sum(len(Word) for Word in wordslist)
print(lineno)
print(words)
print(characters)
Diese Linie:
with open('my_words.txt') as infile:
Öffnet die Datei mit dem Versprechen, sie zu schließen, sobald Sie die Einrückung verlassen haben . Es ist immer ratsam, die Datei zu schließen, nachdem Sie sie verwendet haben.
Denken Sie daran, dass jede Zeile (außer der letzten) ein Zeilentrennzeichen enthält. "\ r\n" für Windows oder "\ n" für Linux und Mac.
Daher werden in diesem Fall genau zwei Zeichen hinzugefügt, nämlich 47 und nicht 45.
Ein schöner Weg, um dies zu überwinden, könnte sein:
import os
fname=input("enter the name of the file:")
infile=open(fname, 'r')
lines=0
words=0
characters=0
for line in infile:
line = line.strip(os.linesep)
wordslist=line.split()
lines=lines+1
words=words+len(wordslist)
characters=characters+ len(line)
print(lines)
print(words)
print(characters)
Um die Zeichen zu zählen, sollten Sie jedes einzelne Wort zählen. So könnten Sie eine andere Schleife haben, die Zeichen zählt:
for Word in wordslist:
characters += len(Word)
Das sollte es tun. Die Wortliste sollte wahrscheinlich Zeilenumbrüche rechts entfernen, etwa wordslist = line.rstrip().split()
.
Dies ist zu lang für einen Kommentar.
Python 2 oder 3? Weil es wirklich wichtig ist . Probieren Sie Folgendes in Ihrem REPL für beide aus:
Python 2.7.12
>>>len("taña")
5
Python 3.5.2
>>>len("taña")
4
Huh Die Antwort liegt in Unicode. Dieser ñ
ist ein 'n' mit einer Kombination diakritisch. Bedeutet 1 Zeichen, aber nicht 1 Byte. Wenn Sie also nicht mit reinem Text ASCII arbeiten, sollten Sie besser angeben, welche Version von Python Ihre Zeichenzählfunktion für ist.
Ich fand diese Lösung sehr einfach und lesbar:
with open("filename", 'r') as file:
text = file.read().strip().split()
len_chars = sum(len(Word) for Word in text)
print(len_chars)
Wie ist das? Es verwendet einen regulären Ausdruck, um alle Nicht-Whitespace-Zeichen zu finden, und gibt die Anzahl der Übereinstimmungen in einer Zeichenfolge zurück.
import re
DATA="""
hey how are you
I am fine and you
Yes I am fine
"""
def get_char_count(s):
return len(re.findall(r'\S', s))
if __== '__main__':
print(get_char_count(DATA))
Ausgabe
35
Das Bild unten zeigt dies auf RegExr getestet:
Es werden wahrscheinlich neue Zeilenzeichen gezählt. Zeichen mit (Zeilen + 1) subtrahieren
Hier ist der Code:
fp = open(fname, 'r+').read()
chars = fp.decode('utf8')
print len(chars)
Überprüfen Sie die Ausgabe. Ich habe es gerade getestet.
Eine mehr Pythonic-Lösung als die anderen:
with open('foo.txt') as f:
text = f.read().splitlines() # list of lines
lines = len(text) # length of the list = number of lines
words = sum(len(line.split()) for line in text) # split each line on spaces, sum up the lengths of the lists of words
characters = sum(len(line) for line in text) # sum up the length of each line
print(lines)
print(words)
print(characters)
Die anderen Antworten hier tun manuell, was str.splitlines()
tut. Es gibt keinen Grund, das Rad neu zu erfinden.
Sie haben die richtige Antwort - und Ihr Code ist absolut korrekt. Ich denke, es ist, dass ein Zeichen für das Zeilenende durchlaufen wird, das die Anzahl der Charaktere um zwei einschließt (in der letzten Zeile gibt es keine Zahl, da keine neue Zeile vorhanden ist). Wenn Sie dies entfernen möchten, ist der einfache Fudge der von Loaf vorgeschlagene Vorschlag
characters = characters - (lines - 1)
Siehe die Antwort von csl für den zweiten Teil ...
Sie haben zwei Probleme. Eines ist das Zeilenende und das andere ist das Leerzeichen dazwischen.
Nun gibt es viele Leute, die ziemlich gute Antworten gepostet haben, aber ich finde diese Methode einfacher zu verstehen:
characters = characters + len(line.strip()) - line.strip().count(' ')
line.strip () entfernt die nachgestellten und führenden Leerzeichen. Dann subtrahiere ich die Anzahl der Leerzeichen von der Gesamtlänge.
Überspringen Sie beim Aufruf von len
einfach unerwünschte Zeichen.
import os
characters=characters+ len([c for c in line if c not in (os.linesep, ' ')])
oder sum
die Anzahl,
characters=characters+ sum(1 for c in line if c not in (os.linesep, ' '))
oder eine str
aus der wordlist
erstellen und len
nehmen,
characters=characters+ len(''.join(wordlist))
oder sum
die Zeichen in der wordlist
. Ich denke das ist das schnellste.
characters=characters+ sum(1 for Word in wordlist for char in Word)
Es ist sehr einfach:
f = open('file.txt', 'rb')
f.seek(0) # Move to the start of file
print len(f.read())
Hier habe ich das kleinste Programm mit weniger Speicherbedarf für Ihr Problem
with open('FileName.txt') as f:
lines = f.readlines()
data = ''.join(lines)
print('lines =',len(lines))
print('Words = ',len(data.split()))
data = ''.join(data.split())
print('characters = ',len(data))
zeilen sind eine Liste von Zeilen. Die Zeilenlänge ist also nur die Zeilenanzahl. Die Daten des nächsten Schritts enthalten eine Zeichenfolge Ihres Dateiinhalts (jedes Wort wird durch ein Leerzeichen getrennt). Wenn Sie also die Daten teilen, erhalten Sie eine Liste der Wörter in Ihrer Datei. Die Länge dieser Liste gibt also die Anzahl der Wörter an. Wenn wir uns wieder der Wortliste anschließen, erhalten Sie alle Zeichen als eine einzige Zeichenfolge. Die Länge davon ergibt also die Anzahl der Zeichen.
übernehmen Sie die Eingabe als Dateinamen, dh files.txt aus dem Eingabeparameter und zählen Sie dann die Gesamtzahl der Zeichen in der Datei und speichern Sie sie in der Variablen - char
fname = input("Enter the name of the file:")
infile = open(fname, 'r') # connection of the file
lines = 0
words = 0
char = 0 # init as zero integer
for line in infile:
wordslist = line.split() # splitting line to Word
lines = lines + 1 # counter up the Word
words = words + len(wordslist) # splitting Word to charac
char = char + len(line) # counter up the character
print("lines are: " + str(lines))
print("words are: " + str(words))
print("chars are: " + str(char)) # printing beautify
num_lines = sum(1 for line in open('filename.txt'))
num_words = sum(1 for Word in open('filename.txt').read().split())
num_chars = sum(len(Word) for Word in open('filename.txt').read().split())