2013-09-25 8 views

Odpowiedz

39

Można użyć sum() z wyrażeniem generatora:

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

Należy pamiętać, że nie można używać len(f), ponieważ f jest iterator. _ to specjalna nazwa zmiennej dla zmiennych jednorazowych, patrz What is the purpose of the single underscore "_" variable in Python?.

Możesz użyć len(f.readlines()), ale utworzy to dodatkową listę w pamięci, która nie będzie działać nawet w przypadku dużych plików, które nie mieszczą się w pamięci.

+1

Tak pyton, tak bardzo pythonic: O – SARose

+0

Byłoby bardziej sprawnie, gdybyś napisał to jako z open ("data.txt") jako f: print sum ([1 dla _ in f])? – jimh

+0

@jimh - lepiej użyć po prostu 'sum (1 dla _ w f)', ponieważ domyślnie używa wyrażenia generatora w nawiasach i nie tworzy listy 1s. Jednak twoja wersja 'sum ([1 for _ in f])' utworzyłaby listę 1s przed ich podsumowaniem, która niepotrzebnie alokuje pamięć. – blokeley

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

print count 
8

Możesz użyć sum() z wyrażeniem generatora tutaj. Wyrażenie generatora będzie [1, 1, ...] aż do długości pliku. Następnie wywołujemy sum(), aby dodać je wszystkie razem, aby uzyskać całkowitą liczbę.

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

Wygląda na to, co próbowałeś, aby nie zamieszczać pustych linii. Następnie można zrobić:

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

Ten link (How to get line count cheaply in Python?) ma wiele potencjalnych rozwiązań, ale wszystkie one ignorować jeden sposób, aby to uruchomić znacznie szybciej, a mianowicie za pomocą niebuforowane (RAW) interfejs, za pomocą bytearrays i robić własne buforowanie.

stosując zmodyfikowaną wersję narzędzia rozrządu, wierzę następujący kod jest szybszy (i nieznacznie więcej pythonic) niż którykolwiek z rozwiązań oferowanych:

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) 

Oto moje czasy:

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 

Wrzuciłbym go tam, ale jestem stosunkowo nowym użytkownikiem do wymiany stosów i nie mam wymaganej manny.

EDIT:

Można to zrobić całkowicie z generatorami wyrażeń in-line przy użyciu itertools, ale robi się dość dziwne spojrzenie:

+2

Dzięki! Ta implementacja itertool płonie szybko i pozwala mi podać procent ukończenia, ponieważ czytany jest bardzo duży plik. –

+0

Występuje błąd: AttributeError: obiekt 'file' nie ma atrybutu "raw". Jakieś pomysły, dlaczego? – MD004

+0

Ten kod jest specyficzny dla Pythona 3, w którym nastąpił podział na raw/unicode. Moja pamięć Pythona 2 nie jest dobra w tym momencie, ale jeśli używasz Pythona 2, myślę, że jeśli zmienisz tryb wywołania open() na "r" i po prostu zmienisz "f.raw.read()" na "f.read()" skutecznie uzyskasz to samo w pythonie 2. –

0

ten daje również linie ilosc w pliku .

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

One liner:

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

print(total_line_count) 
0

Zastosowanie:

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

To zadziała.

0

Dla ludzi mówiąc używać with open ("filename.txt","r") as f można zrobić anyname = open("filename.txt","r")

def main(): 

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

    print (count) 

main() 
0

oto jak można to zrobić poprzez listowego, ale to będzie tracić trochę pamięci komputera jako line.strip() został wywołany dwukrotnie.

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