2013-09-25 12 views
19

Zum Beispiel, wenn meine Textdatei ist:wie die Gesamtzahl der Zeilen in einer Textdatei zählen Python mit

blue 
green 
yellow 
black 

Hier gibt vier Linien sind und jetzt mag ich das Ergebnis als vier erhalten. Wie kann ich das machen?

+0

open ('data.txt') als fp: für Zeile in fp: wenn line.strip(): count + = 1 –

+0

@alecxe wird es funktionieren.? –

+1

Ja, es wird funktionieren, aber die Lösung ist nicht pythonisch, besser verwenden Sie 'sum()'. – alecxe

Antwort

39

Sie können sum() mit einem Generator Ausdruck verwenden:

with open('data.txt') as f: 
    print sum(1 for _ in f) 

Beachten Sie, dass Sie nicht len(f), da f ist ein iterator verwenden können. _ ist ein spezieller Variablenname für Wegwerfvariablen, siehe What is the purpose of the single underscore "_" variable in Python?.

können Sie verwenden len(f.readlines()), aber das wird eine zusätzliche Liste im Speicher erstellen, die auf große Dateien nicht einmal funktionieren werden, die im Speicher nicht passen.

+1

So Pythonic, so sehr Pythonic: O – SARose

+0

Wäre es schneller, wenn Sie es als geschrieben haben mit open ('data.txt') als f: Drucksumme ([1 für _ in f])? – jimh

+0

@jimh - es ist besser, nur 'sum (1 für _in f)' zu verwenden, da es implizit einen Generatorausdruck innerhalb der Klammern verwendet und keine Liste von 1en erstellt. Allerdings würde Ihre Version 'sum ([1 für _ in f])' eine Liste von 1en erstellen, bevor sie summiert werden, wodurch unnötiger Speicher reserviert wird. – blokeley

4
count=0 
with open ('filename.txt','rb') as f: 
    for line in f: 
     count+=1 

print count 
8

Sie können hier sum() mit einem Generator Ausdruck verwenden. Der Generatorausdruck wird [1, 1, ...] bis zur Länge der Datei sein. Dann rufen wir sum() an, um sie alle zusammen zu addieren, um die Gesamtanzahl zu erhalten.

with open('text.txt') as myfile: 
    count = sum(1 for line in myfile) 

Es scheint von dem, was Sie versucht haben, dass Sie keine Leerzeilen enthalten sein sollen. Anschließend können Sie tun:

with open('text.txt') as myfile: 
    count = sum(1 for line in myfile if line.rstrip('\n')) 
17

Dieser Link (How to get line count cheaply in Python?) viele mögliche Lösungen, aber sie alle ignorieren eine Möglichkeit, diese laufen wesentlich schneller zu machen, und zwar durch die ungepufferte (raw) Schnittstelle, mit Bytearrays und deine eigene Pufferung machen.

eine modifizierte Version des Werkzeugs Timing verwenden, glaube ich, der folgende Code ist schneller (und mehr pythonic marginal) als jede der angebotenen Lösungen:

def _make_gen(reader): 
    b = reader(1024 * 1024) 
    while b: 
     yield b 
     b = reader(1024*1024) 

def rawpycount(filename): 
    f = open(filename, 'rb') 
    f_gen = _make_gen(f.raw.read) 
    return sum(buf.count(b'\n') for buf in f_gen) 

Hier meine Timings sind:

rawpycount  0.0048 0.0046 1.00 
bufcount   0.0074 0.0066 1.43 
wccount    0.01 0.01 2.17 
itercount   0.014 0.014 3.04 
opcount   0.021 0.02 4.43 
kylecount   0.023 0.021 4.58 
simplecount  0.022 0.022 4.81 
mapcount   0.038 0.032 6.82 

ich würde es dort veröffentlichen, aber ich bin ein relativ neuen User Austausch zu stapeln und nicht die erforderliche Manna habe.

EDIT:

Der komplett in-line mit Generatoren Ausdrücken durchgeführt werden kann itertools verwenden, aber es wird ziemlich komisch aussehende:

+2

Vielen Dank! Diese itertool-Implementierung ist blitzschnell und lässt mich einen Prozentsatz der Fertigstellung geben, wenn eine sehr große Datei gelesen wird. –

+0

Ich bekomme einen Fehler: AttributeError: 'Datei' Objekt hat kein Attribut 'roh'. Irgendwelche Ideen warum? – MD004

+0

Der Code hier ist Python 3 spezifisch, und die Raw/Unicode-Split dort passiert. Mein Python 2-Speicher ist zu diesem Zeitpunkt nicht gut, aber wenn Sie Python 2 verwenden, denke ich, wenn Sie den Modus für den Aufruf von open() in 'r' ändern und einfach "f.raw.read()" in ändern "f.read()" werden Sie in Python 2 das gleiche bekommen. –

0

das man auch die Anzahl Zeilen in einer Datei gibt .

a=open('filename.txt','r') 
l=a.read() 
count=l.splitlines() 
print(len(count)) 
2

Motto:

total_line_count = sum(1 for line in open("filename.txt")) 

print(total_line_count) 
0

Verwendung:

num_lines = sum(1 for line in open('data.txt')) 
print(num_lines) 

das funktionieren wird.

0

Für die Leute, die sagen with open ("filename.txt","r") as f verwenden Sie tun können, anyname = open("filename.txt","r")

def main(): 

    file = open("infile.txt",'r') 
    count = 0 
    for line in file: 
      count+=1 

    print (count) 

main() 
0

hier, wie Sie es durch Liste Verständnis tun können, aber das wird ein wenig Speicher des Computers als line.strip Abfall() wurde zweimal aufgerufen.

 with open('textfile.txt') as file: 
lines =[ 
      line.strip() 
      for line in file 
      if line.strip() != ''] 
print("number of lines = {}".format(len(lines))) 
Verwandte Themen