Hướng dẫn how do i find out how many lines a text file has in python? - làm cách nào để biết một tệp văn bản có bao nhiêu dòng trong python?

Đếm các dòng trong một tệp

Tín dụng: Luther Blissett

Vấn đề

Bạn cần tính toán số lượng dòng trong một tệp.

Dung dịch

Cách tiếp cận đơn giản nhất, đối với các tệp có kích thước hợp lý, là đọc tệp dưới dạng danh sách các dòng để số lượng dòng là độ dài của danh sách. Nếu đường dẫn của tệp trên một chuỗi liên kết với biến thefilepath, thì đó chỉ là:

count = len[open[thefilepath].readlines[  ]]

Đối với một tập tin thực sự lớn, điều này có thể rất chậm hoặc thậm chí không hoạt động. Nếu bạn phải lo lắng về các tệp hài hước, một vòng lặp sử dụng phương thức xreadlines luôn hoạt động:

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1

Ở đây, một sự thay thế hơi khó khăn, nếu bộ hủy dòng là '\n' [hoặc có ____99 dưới dạng phụ, như xảy ra trên Windows]:

count = 0
thefile = open[thefilepath, 'rb']
while 1:
    buffer = thefile.read[8192*1024]
    if not buffer: break
    count += buffer.count['\n']
thefile.close[  ]

Nếu không có đối số

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
1 cho
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
2, điều này sẽ hoạt động ở bất cứ đâu, nhưng hiệu suất có thể bị ảnh hưởng rất nhiều trên các nền tảng Windows hoặc Macintosh.

Thảo luận

Nếu bạn có một chương trình bên ngoài đếm các dòng tệp, chẳng hạn như

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
3 trên các nền tảng giống UNIX, tất nhiên bạn có thể chọn sử dụng điều đó [ví dụ: thông qua
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
4]. Tuy nhiên, nó nói chung đơn giản hơn, nhanh hơn và di động hơn để thực hiện việc đếm dòng trong chương trình của bạn. Bạn có thể dựa vào hầu hết tất cả các tệp văn bản có kích thước hợp lý, để đọc toàn bộ tệp vào bộ nhớ cùng một lúc là khả thi. Đối với tất cả các tệp bình thường như vậy,
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
5 về kết quả của
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
6 cung cấp cho bạn số lượng dòng theo cách đơn giản nhất.

Nếu tệp lớn hơn bộ nhớ có sẵn [giả sử, vài trăm megabyte trên một PC điển hình ngày nay], giải pháp đơn giản nhất có thể trở nên chậm, vì hệ điều hành đấu tranh để phù hợp với nội dung tệp vào bộ nhớ ảo. Nó thậm chí có thể thất bại, khi không gian hoán đổi hết và bộ nhớ ảo có thể giúp đỡ nữa. Trên một PC điển hình, với 256 MB RAM và không gian đĩa hầu như không giới hạn, bạn vẫn nên mong đợi các vấn đề nghiêm trọng khi bạn cố gắng đọc vào các tệp bộ nhớ của, giả sử, 1 hoặc 2 GB, tùy thuộc vào hệ điều hành của bạn [một số hệ điều hành là nhiều mong manh hơn những người khác trong việc xử lý các vấn đề bộ nhớ ảo trong các điều kiện tải quá mức như vậy]. Trong trường hợp này, phương thức xreadlines của các đối tượng tệp, được giới thiệu trong Python 2.1, nói chung là một cách tốt để xử lý các tệp văn bản từng dòng. Trong Python 2.2, bạn có thể làm tốt hơn nữa, về cả sự rõ ràng và tốc độ, bằng cách lặp trực tiếp trên đối tượng tệp:

for line in open[thefilepath]: count += 1

Tuy nhiên, xreadlines không trả về một chuỗi và cũng không có vòng lặp trực tiếp trên đối tượng tệp, vì vậy bạn có thể chỉ sử dụng

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
5 trong những trường hợp này để có được số lượng dòng. Thay vào đó, bạn phải lặp và đếm từng dòng, như thể hiện trong giải pháp.

Đếm các ký tự thiết bị đầu cuối dòng trong khi đọc tệp theo byte, trong các khối có kích thước hợp lý, là ý tưởng chính trong cách tiếp cận thứ ba. Nó có lẽ ít trực quan nhất ngay lập tức, và nó không hoàn toàn đa nền tảng, nhưng bạn có thể hy vọng rằng nó nhanh nhất [ví dụ, bằng cách tương tự với Công thức 8.2 trong cuốn sách nấu ăn Perl].Perl Cookbook].

Tuy nhiên, hãy nhớ rằng, trong hầu hết các trường hợp, hiệu suất không thực sự quan trọng đến thế. Khi nó quan trọng, thời gian chìm có thể không phải là những gì mà trực giác của bạn nói với bạn, vì vậy bạn không bao giờ nên tin vào trực giác của mình trong vấn đề này, thay vào đó, luôn luôn là điểm chuẩn và đo lường. Ví dụ: tôi đã lấy một tệp syslog UNIX điển hình có kích thước trung gian, một chút hơn 18 MB văn bản trong 230.000 dòng:

[situ@tioni nuc]$ wc nuc
 231581 2312730 18508908 nuc

Và tôi đã thiết lập tập lệnh khung điểm chuẩn sau,

count = 0
thefile = open[thefilepath, 'rb']
while 1:
    buffer = thefile.read[8192*1024]
    if not buffer: break
    count += buffer.count['\n']
thefile.close[  ]
0:

import time

def timeo[fun, n=10]:
    start = time.clock[  ]
    for i in range[n]: fun[  ]
    stend = time.clock[  ]
    thetime = stend-start
    return fun._ _name_ _, thetime

import os

def linecount_wc[  ]:
    return int[os.popen['wc -l nuc'].read[].split[  ][0]]

def linecount_1[  ]:
    return len[open['nuc'].readlines[  ]]

def linecount_2[  ]:
    count = 0
    for line in open['nuc'].xreadlines[  ]: count += 1
    return count

def linecount_3[  ]:
    count = 0
    thefile = open['nuc']
    while 1:
        buffer = thefile.read[65536]
        if not buffer: break
        count += buffer.count['\n']
    return count

for f in linecount_wc, linecount_1, linecount_2, linecount_3:
    print f._ _name_ _, f[  ]

for f in linecount_1, linecount_2, linecount_3:
    print "%s: %.2f"%timeo[f]

Đầu tiên, tôi in số lượng dòng thu được bằng tất cả các phương pháp, do đó đảm bảo rằng không có sự bất thường hay lỗi nào [đếm các tác vụ nổi tiếng dễ bị lỗi]. Sau đó, tôi chạy từng phương án 10 lần, dưới sự kiểm soát của hàm thời gian

count = 0
thefile = open[thefilepath, 'rb']
while 1:
    buffer = thefile.read[8192*1024]
    if not buffer: break
    count += buffer.count['\n']
thefile.close[  ]
1 và xem xét kết quả. Họ đây rồi:

[situ@tioni nuc]$ python -O bench.py
linecount_wc 231581
linecount_1 231581
linecount_2 231581
linecount_3 231581
linecount_1: 4.84
linecount_2: 4.54
linecount_3: 5.02

Như bạn có thể thấy, sự khác biệt về hiệu suất hầu như không quan trọng: chênh lệch 10% hoặc hơn trong một nhiệm vụ phụ trợ là điều mà người dùng của bạn thậm chí sẽ không bao giờ nhận thấy. Tuy nhiên, cách tiếp cận nhanh nhất [đối với hoàn cảnh cụ thể của tôi, PC rẻ nhưng rất gần đây chạy phân phối Linux phổ biến, cũng như điểm chuẩn cụ thể này] Điều đó đếm các thiết bị kết thúc dòng bằng các khối. Trong thực tế, trừ khi tôi phải lo lắng về các tập tin của hàng trăm megabyte, tôi đã luôn sử dụng phương pháp đơn giản nhất [tức là, cái đầu tiên được trình bày trong công thức này].

Xem thêm

Phần tham chiếu thư viện trên các đối tượng tệp và mô -đun

count = 0
thefile = open[thefilepath, 'rb']
while 1:
    buffer = thefile.read[8192*1024]
    if not buffer: break
    count += buffer.count['\n']
thefile.close[  ]
2; Perl Cookbook Recipe 8.2.Library Reference section on file objects and the
count = 0
thefile = open[thefilepath, 'rb']
while 1:
    buffer = thefile.read[8192*1024]
    if not buffer: break
    count += buffer.count['\n']
thefile.close[  ]
2 module; Perl Cookbook Recipe 8.2.

Bài Viết Liên Quan

Chủ Đề