Điều kiện tiên quyết: Xử lý tập tin trong Python & NBSP; File Handling in Python
Đếm số lượng ký tự là quan trọng vì hầu hết các hộp văn bản dựa vào đầu vào của người dùng đều có giới hạn nhất định về số lượng ký tự có thể được chèn. Ví dụ: nếu tệp nhỏ, bạn có thể sử dụng readlines [] hoặc cách tiếp cận vòng lặp. Nếu bạn có nhiều tệp để làm việc để xác định số lượng dòng, hãy sử dụng giao diện máy phát và giao diện thô, & nbsp; nếu bạn không muốn & nbsp; tải tệp hoàn chỉnh vào, hãy sử dụng vòng lặp và liệt kê [] cho các tệp khổng lồ. Chương trình này trong xử lý tệp dữ liệu trong Python nhấn mạnh việc đếm số lượng dòng trong một tệp văn bản trong Python. & NBSP;
Dưới đây là việc thực hiện. & NBSP;
Hãy giả sử tệp văn bản trông như thế này - & nbsp;
myfile.txt
Phương pháp 1: Số lượng Python số dòng trong chuỗi bằng cách sử dụng đường đọc []
Các đường đọc [] được sử dụng để đọc tất cả các dòng trong một lần và sau đó trả về chúng dưới dạng mỗi dòng một phần tử chuỗi trong một danh sách. Chức năng này có thể được sử dụng cho các tệp nhỏ
Python3
Total Number of lines: 51
Total Number of lines: 52
Total Number of lines: 53
Total Number of lines: 54
Total Number of lines: 55
Total Number of lines: 56
Total Number of lines: 57
Total Number of lines: 58
Total Number of lines: 59
This is the number of lines in the file 40
This is the number of lines in the file 41
This is the number of lines in the file 42
Total Number of lines: 58
This is the number of lines in the file 44
This is the number of lines in the file 45
This is the number of lines in the file 46
This is the number of lines in the file 47
Output:
Total Number of lines: 5
Phương pháp 2: Số lượng dòng Python trong tệp văn bản bằng cách sử dụng liệt kê
Phương thức liệt kê [] thêm một bộ đếm cho một điều đó và trả lại nó trong một hình thức liệt kê đối tượng. & NBSP;
Python3
Total Number of lines: 51
Total Number of lines: 52
Total Number of lines: 53
Total Number of lines: 54
Total Number of lines: 55
Total Number of lines: 56
Total Number of lines: 57
Total Number of lines: 58
Total Number of lines: 56
Total Number of lines: 57
Total Number of lines: 58
Total Number of lines: 59
count = len[open[thefilepath].readlines[ ]]0
count = len[open[thefilepath].readlines[ ]]1
count = len[open[thefilepath].readlines[ ]]2
This is the number of lines in the file 44
This is the number of lines in the file 45
This is the number of lines in the file 46
count = len[open[thefilepath].readlines[ ]]6
count = len[open[thefilepath].readlines[ ]]7
count = len[open[thefilepath].readlines[ ]]8
count = len[open[thefilepath].readlines[ ]]9
Output:
Total Number of lines: 5
Phương pháp 3: Sử dụng vòng lặp và bộ đếm cho các dòng đếm
Vòng lặp Python được sử dụng cho các lần đi ngang tuần tự. Ở đây chúng tôi sẽ đếm số lượng dòng bằng cách sử dụng vòng lặp và câu lệnh IF. Nếu giúp chúng tôi xác định có bất kỳ ký tự nào hay không, nếu sẽ có bất kỳ ký tự nào có điều kiện nếu điều kiện trả về đúng và bộ đếm sẽ tăng lên.
Python3
count = 0 for line in open[thefilepath].xreadlines[ ]: count += 10
This is the number of lines in the file 40
Total Number of lines: 52
This is the number of lines in the file 45
count = 0 for line in open[thefilepath].xreadlines[ ]: count += 14
Total Number of lines: 55
count = 0 for line in open[thefilepath].xreadlines[ ]: count += 16
count = len[open[thefilepath].readlines[ ]]9
count = 0 for line in open[thefilepath].xreadlines[ ]: count += 18
This is the number of lines in the file 40
count = 0 thefile = open[thefilepath, 'rb'] while 1: buffer = thefile.read[8192*1024] if not buffer: break count += buffer.count['\n'] thefile.close[ ]0
count = 0 thefile = open[thefilepath, 'rb'] while 1: buffer = thefile.read[8192*1024] if not buffer: break count += buffer.count['\n'] thefile.close[ ]1
This is the number of lines in the file 40
count = 0 for line in open[thefilepath].xreadlines[ ]: count += 10
count = 0 thefile = open[thefilepath, 'rb'] while 1: buffer = thefile.read[8192*1024] if not buffer: break count += buffer.count['\n'] thefile.close[ ]4
count = 0 thefile = open[thefilepath, 'rb'] while 1: buffer = thefile.read[8192*1024] if not buffer: break count += buffer.count['\n'] thefile.close[ ]5
This is the number of lines in the file 40
count = 0 thefile = open[thefilepath, 'rb'] while 1: buffer = thefile.read[8192*1024] if not buffer: break count += buffer.count['\n'] thefile.close[ ]7
count = 0 thefile = open[thefilepath, 'rb'] while 1: buffer = thefile.read[8192*1024] if not buffer: break count += buffer.count['\n'] thefile.close[ ]8
count = len[open[thefilepath].readlines[ ]]9
Total Number of lines: 56
for line in open[thefilepath]: count += 11
Total Number of lines: 58
for line in open[thefilepath]: count += 13
Total Number of lines: 58
for line in open[thefilepath]: count += 15
for line in open[thefilepath]: count += 16
count = len[open[thefilepath].readlines[ ]]1
count = 0 for line in open[thefilepath].xreadlines[ ]: count += 18
count = len[open[thefilepath].readlines[ ]]7
This is the number of lines in the file 40
count = len[open[thefilepath].readlines[ ]]8
This is the number of lines in the file 44
This is the number of lines in the file 45
[situ@tioni nuc]$ wc nuc
231581 2312730 18508908 nuc
4count = len[open[thefilepath].readlines[ ]]9
This is the number of lines in the file 44
[situ@tioni nuc]$ wc nuc
231581 2312730 18508908 nuc
7Output:
This is the number of lines in the file 4
Phương pháp 4: Sử dụng chức năng Loop và Sum để đếm các dòng
Vòng lặp Python được sử dụng cho các lần đi ngang tuần tự. Ở đây chúng tôi sẽ đếm số lượng dòng sử dụng hàm tổng trong Python. Nếu giúp chúng tôi xác định có bất kỳ ký tự nào hay không, nếu sẽ có bất kỳ ký tự nào có điều kiện nếu điều kiện trả về đúng và bộ đếm sẽ tăng lên.
Python3
Total Number of lines: 51
Total Number of lines: 52
Total Number of lines: 53
Total Number of lines: 54
Total Number of lines: 55
Total Number of lines: 56
Total Number of lines: 57
Total Number of lines: 58
Total Number of lines: 59
This is the number of lines in the file 40
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]8
This is the number of lines in the file 45
count = len[open[thefilepath].readlines[ ]]8
Total Number of lines: 58
This is the number of lines in the file 44
This is the number of lines in the file 45
This is the number of lines in the file 46
This is the number of lines in the file 47
Output:
Total Number of lines: 5
Đế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
Total Number of lines: 510, 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
Total Number of lines: 511 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à
Total Number of lines: 512 [hoặc có
Total Number of lines: 512 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ố
Total Number of lines: 514 cho
Total Number of lines: 52, đ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ư
Total Number of lines: 516 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
Total Number of lines: 517]. 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,
This is the number of lines in the file 41 về kết quả của
Total Number of lines: 519 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
Total Number of lines: 511 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,
Total Number of lines: 511 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
This is the number of lines in the file 41 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 đây,
Total Number of lines: 523:
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
Total Number of lines: 524 và xem xét kết quả. Họ đây rồi:
Total Number of lines: 50
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
Total Number of lines: 525; Perl Cookbook Recipe 8.2.Library Reference section on file objects and the
Total Number of lines: 525 module; Perl Cookbook Recipe 8.2.