webentwicklung-frage-antwort-db.com.de

Ermitteln Sie die Anzahl der Zeichen in einer Datei mit Python

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.

19
S.Soopra

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)

Verbesserte Version

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.

19
Mike Müller

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)
9
Solo

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

8
csl

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.

7
Jared Smith

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)
6
barrios

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:

 Regex Test

6
Tagc

Es werden wahrscheinlich neue Zeilenzeichen gezählt. Zeichen mit (Zeilen + 1) subtrahieren

5
Loaf

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.

5
Rahul Meshram

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.

4
Mego

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 ...

3
A. N. Other

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.

3
Jimmar

Ü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)
3
Nizam Mohamed

Es ist sehr einfach:

f = open('file.txt', 'rb')
f.seek(0) # Move to the start of file
print len(f.read()) 
0
A.Gorbunoff

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.

0
manik venkat

ü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
0
Hiren More
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())
0
Gagana