2013-09-25 31 views
19

Ví dụ, nếu tập tin văn bản của tôi là:làm thế nào để đếm tổng số dòng trong một file văn bản sử dụng python

blue 
green 
yellow 
black 

Ở đây có bốn dòng và bây giờ tôi muốn để có được kết quả như bốn. Làm thế nào tôi có thể làm điều đó?

+0

mở ('data.txt') như fp: cho dòng trong fp: nếu line.strip(): count + = 1 –

+0

@alecxe nó sẽ làm việc.? –

+1

Có, nó sẽ hoạt động, nhưng giải pháp không phải là pythonic, sử dụng tốt hơn 'sum()'. – alecxe

Trả lời

39

Bạn có thể sử dụng sum() với một biểu thức máy phát điện:

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

Lưu ý rằng bạn không thể sử dụng len(f), vì f là một iterator. _ là tên biến đặc biệt cho biến số throwaway, xem What is the purpose of the single underscore "_" variable in Python?.

Bạn có thể sử dụng len(f.readlines()), nhưng điều này sẽ tạo danh sách bổ sung trong bộ nhớ, thậm chí sẽ không hoạt động trên các tệp lớn không vừa trong bộ nhớ.

+1

Vì vậy, pythonic, vì vậy rất pythonic: O – SARose

+0

Nó sẽ được nhanh hơn nếu bạn đã viết nó như là với mở ('data.txt') là f: tổng in ([1 cho _ trong f])? – jimh

+0

@jimh - tốt hơn là chỉ sử dụng 'tổng (1 cho _ trong f)' vì nó ngầm sử dụng biểu thức trình tạo trong dấu ngoặc đơn và không tạo danh sách 1 giây. Tuy nhiên, phiên bản 'sum ([1 cho _ trong f])' sẽ tạo một danh sách 1s trước khi tổng hợp chúng, phân bổ bộ nhớ không cần thiết. – blokeley

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

print count 
8

Bạn có thể sử dụng sum() với biểu thức trình tạo tại đây. Biểu thức trình tạo sẽ là [1, 1, ...] tối đa độ dài của tệp. Sau đó, chúng tôi gọi sum() để thêm tất cả chúng lại với nhau, để nhận tổng số.

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

Có vẻ như những gì bạn đã thử mà bạn không muốn bao gồm các dòng trống. Sau đó bạn có thể làm:

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

Liên kết này (How to get line count cheaply in Python?) có rất nhiều giải pháp tiềm năng, nhưng tất cả đều bỏ qua một cách để làm cho hoạt động này nhanh hơn đáng kể, cụ thể là bằng (thô) giao diện không có bộ đệm, sử dụng bytearrays, và làm đệm của riêng bạn.

Sử dụng một phiên bản sửa đổi của các công cụ thời gian, tôi tin rằng đoạn mã sau là nhanh hơn (và nhẹ pythonic hơn) so với bất kỳ giải pháp cung cấp:

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) 

Dưới đây là timings của tôi:

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 

Tôi sẽ đăng nó ở đó, nhưng tôi là một người dùng tương đối mới để ngăn xếp trao đổi và không có manna cần thiết.

EDIT:

Điều này có thể được thực hiện hoàn toàn bằng máy phát biểu trong dòng sử dụng itertools, nhưng nó được khá kỳ lạ tìm kiếm:

+2

Cảm ơn! Việc thực thi itertool này rất nhanh và cho phép tôi đưa ra một tỷ lệ phần trăm hoàn thành khi một tệp rất lớn được đọc. –

+0

Tôi gặp lỗi: AttributeError: đối tượng 'file' không có thuộc tính 'raw'. Bất kỳ ý tưởng tại sao? – MD004

+0

Mã ở đây là python 3 cụ thể, và sự phân chia nguyên/unicode xảy ra ở đó. Bộ nhớ python 2 của tôi không tốt vào thời điểm này, nhưng nếu bạn đang sử dụng python 2, tôi nghĩ nếu bạn thay đổi chế độ trên cuộc gọi open() thành 'r' và chỉ thay đổi "f.raw.read()" thành "f.read()" bạn sẽ có được hiệu quả tương tự trong python 2. –

0

này cũng cung cấp cho các dòng no.of trong một file .

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

Một lót:

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

print(total_line_count) 
0

Sử dụng:

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

Điều đó sẽ làm việc.

0

Đối với những người nói sử dụng with open ("filename.txt","r") as f bạn có thể làm anyname = open("filename.txt","r")

def main(): 

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

    print (count) 

main() 
0

đây là cách bạn có thể làm điều đó thông qua danh sách hiểu, nhưng điều này sẽ lãng phí một chút bộ nhớ máy tính của bạn như line.strip() đã được gọi hai lần.

 with open('textfile.txt') as file: 
lines =[ 
      line.strip() 
      for line in file 
      if line.strip() != ''] 
print("number of lines = {}".format(len(lines))) 
Các vấn đề liên quan