Skip to main content

[python] đếm số dòng của 1 file.

Để đếm số dòng của một file, trên UNIX-like OSes, ta có thể dùng lệnh ``wc``. Lấy file /etc/passwd làm chuột bạch:
$ wc -l /etc/passwd
      86 /etc/passwd
Trong python, các nhanh nhất để làm việc này là:
(hãy tự trả lời trước khi xem đáp án)


In [1]: sum(1 for line in open('/etc/passwd'))
Out[1]: 86
Giải thích

sum - tính tổng của một chuỗi các số.
open('/etc/passwd') - mở file /etc/passwd và trả về một file object. File object cũng là iterator object, nó implement 2 method theo iterator protocol:

In [4]: f = open('/etc/passwd')

In [8]: hasattr(f, '__iter__')
Out[8]: True

In [9]: hasattr(f, 'next')
Out[9]: True

Nói đơn giản, bất cứ object nào có CẢ 2 method __iter__ và next thì nó đã implement iterator protocol và object đấy có thể dùng như 1 iterator. Khi một object (f) là 1 iterator thì có thể viết:
for x in f: 
để duyệt qua các phần tử mà f sẽ trả về.

Với file object, nó trả về lần lượt từng dòng trong file.
1 for line in open('/etc/passwd') - sẽ trả về một list toàn số 1, số các số 1 bằng số dòng trong file /etc/passwd.
Nên tổng của list này chính là số dòng trong file.

Bonus
 đếm số dòng của tất cả các file có extension là ".py" trong một thư mục:

def count(dest='.', ftype='.py'):
    no_files = 0
    locs = 0

    def filenames():
        for d, _, fns in os.walk(dest):
            for fn in fns:
                yield os.path.join(d, fn)

    for fn in filenames():
        no_files += 1
        fd = open(fn)
        loc = sum(1 for line in fd)
        print '%5d %s' % (loc, fn)
        locs += loc
        fd.close() # đóng file sau khi dùng xong để tránh leak file descriptor, có thể dùng with open(fn) để tự động làm việc này 

    print 'Total of files:', no_files
    print 'Total of lines:', locs
 
 
Credit:
http://stackoverflow.com/questions/845058/how-to-get-line-count-cheaply-in-python 

Comments

  1. In [1]: sum(1 for line in open('/etc/passwd'))
    => đơn giản nhưng không phải thằng nào cũng nghĩ ra (y)
    Thanks

    ReplyDelete

Post a Comment

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG