Hướng dẫn how do you read the full content of a file in python? - làm thế nào để bạn đọc toàn bộ nội dung của một tệp trong python?

Bạn đang ở đây: Trang chủ/ Python/ Làm thế nào để đọc toàn bộ tệp văn bản trong Python?Home / Python / How to read entire text file in Python?

Ngày 5 tháng 1 năm 2018 bởi cmdlinetipscmdlinetips

Thông thường người ta có thể cần đọc toàn bộ nội dung của tệp văn bản (hoặc tệp phẳng) cùng một lúc trong Python. Trong bài đăng này, chúng tôi đã cho thấy một ví dụ về việc đọc toàn bộ tệp và đọc từng dòng tệp văn bản. Dưới đây là một cách khác để nhập toàn bộ nội dung của tệp văn bản.

# Open a file: file
file = open('my_text_file',mode='r')

# read all lines at once
all_of_it = file.read()

# close the file
file.close()

Bài viết liên quan:

Câu trả lời cho câu hỏi đó phụ thuộc phần nào vào việc thực hiện Python cụ thể.

Để hiểu tất cả những gì về điều này, đặc biệt chú ý đến đối tượng file thực tế. Trong mã của bạn, đối tượng đó chỉ được đề cập một lần, trong một biểu thức và trở nên không thể truy cập ngay sau khi cuộc gọi read() trả về.

Điều này có nghĩa là đối tượng tệp là rác. Câu hỏi duy nhất còn lại là "Khi nào bộ thu gom rác sẽ thu thập đối tượng tệp?".

Trong Cpython, sử dụng một bộ đếm tham chiếu, loại rác này được chú ý ngay lập tức, và do đó nó sẽ được thu thập ngay lập tức. Điều này nói chung không đúng với các triển khai Python khác.

Một giải pháp tốt hơn, để đảm bảo rằng tệp được đóng, là mẫu này:

with open('Path/to/file', 'r') as content_file:
    content = content_file.read()

sẽ luôn đóng tệp ngay sau khi khối kết thúc; Ngay cả khi một ngoại lệ xảy ra.

Chỉnh sửa: Để đặt một điểm tốt hơn trên đó:

Khác với file.__exit__(), được "tự động" được gọi trong cài đặt Trình quản lý bối cảnh

with open('Path/to/file', 'r') as content_file:
    content = content_file.read()
0, cách duy nhất khác mà
with open('Path/to/file', 'r') as content_file:
    content = content_file.read()
1 được gọi tự động (nghĩa là, ngoài việc gọi nó một cách rõ ràng,) là thông qua
with open('Path/to/file', 'r') as content_file:
    content = content_file.read()
2. Điều này dẫn chúng ta đến câu hỏi khi nào
with open('Path/to/file', 'r') as content_file:
    content = content_file.read()
3 được gọi?

Một chương trình được viết chính xác không thể cho rằng Finalizer sẽ chạy tại bất kỳ thời điểm nào trước khi chấm dứt chương trình.

-https://devblogs.microsoft.com/oldnewthing/20100809-00/?p=13203

Đặc biệt:

Các đối tượng không bao giờ bị phá hủy rõ ràng; Tuy nhiên, khi chúng không thể truy cập được, chúng có thể được thu thập rác. Việc triển khai được phép hoãn thu thập rác hoặc bỏ qua hoàn toàn - đó là vấn đề về chất lượng thực hiện cách thực hiện bộ sưu tập rác, miễn là không có đối tượng nào được thu thập vẫn có thể truy cập được.An implementation is allowed to postpone garbage collection or omit it altogether — it is a matter of implementation quality how garbage collection is implemented, as long as no objects are collected that are still reachable.

[...]

Cpython hiện đang sử dụng sơ đồ đếm tham chiếu với (tùy chọn) bị trì hoãn phát hiện rác được liên kết theo chu kỳ, thu thập hầu hết các đối tượng ngay khi chúng không thể truy cập được, nhưng không được đảm bảo để thu thập rác có chứa các tài liệu tham khảo tròn.

-https://docs.python.org/3.5/reference/datamodel.html#objects-values-and-ypes

(Nhấn mạnh của tôi)

Nhưng như nó gợi ý, các triển khai khác có thể có hành vi khác. Ví dụ, Pypy có 6 triển khai thu gom rác khác nhau!

Đối tượng tệp Python cung cấp nhiều cách khác nhau để đọc tệp văn bản. Cách phổ biến là sử dụng phương thức readlines () trả về danh sách tất cả các dòng trong tệp. Tuy nhiên, nó không phù hợp để đọc một tệp văn bản lớn vì toàn bộ nội dung tệp sẽ được tải vào bộ nhớ.

Đọc các tệp văn bản lớn trong Python

Chúng ta có thể sử dụng đối tượng tệp như một trình lặp. Trình lặp sẽ trả về từng dòng một, có thể được xử lý. Điều này sẽ không đọc toàn bộ tệp vào bộ nhớ và nó phù hợp để đọc các tệp lớn trong Python. Dưới đây là đoạn mã để đọc tệp lớn trong Python bằng cách coi nó như một trình lặp.

import resource
import os

file_name = "/Users/pankaj/abcdef.txt"

print(f'File Size is {os.stat(file_name).st_size / (1024 * 1024)} MB')

txt_file = open(file_name)

count = 0

for line in txt_file:
    # we can process file line by line here, for simplicity I am taking count of lines
    count += 1

txt_file.close()

print(f'Number of Lines in the file is {count}')

print('Peak Memory Usage =', resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('User Mode Time =', resource.getrusage(resource.RUSAGE_SELF).ru_utime)
print('System Mode Time =', resource.getrusage(resource.RUSAGE_SELF).ru_stime)

Khi chúng tôi chạy chương trình này, đầu ra được tạo ra là:

File Size is 257.4920654296875 MB
Number of Lines in the file is 60000000
Peak Memory Usage = 5840896
User Mode Time = 11.46692
System Mode Time = 0.09655899999999999
Python đọc tệp văn bản lớn
Hướng dẫn how do you read the full content of a file in python? - làm thế nào để bạn đọc toàn bộ nội dung của một tệp trong python?
Python Read Large Text File
  • Tôi đang sử dụng mô -đun HĐH để in kích thước của tệp.
  • Mô -đun tài nguyên được sử dụng để kiểm tra bộ nhớ và thời gian CPU của chương trình.

Chúng tôi cũng có thể sử dụng với câu lệnh để mở tệp. Trong trường hợp này, chúng tôi không thể đóng rõ ràng đối tượng tệp.with statement to open the file. In this case, we don’t have to explicitly close the file object.

with open(file_name) as txt_file:
    for line in txt_file:
        # process the line
        pass

Điều gì sẽ xảy ra nếu tệp lớn không có dòng?

Mã trên sẽ hoạt động rất tốt khi nội dung tệp lớn được chia thành nhiều dòng. Nhưng, nếu có một lượng lớn dữ liệu trong một dòng thì nó sẽ sử dụng rất nhiều bộ nhớ. Trong trường hợp đó, chúng ta có thể đọc nội dung tệp thành bộ đệm và xử lý nó.

with open(file_name) as f:
    while True:
        data = f.read(1024)
        if not data:
            break
        print(data)

Mã trên sẽ đọc dữ liệu tệp thành bộ đệm gồm 1024 byte. Sau đó, chúng tôi đang in nó vào bảng điều khiển. Khi toàn bộ tệp được đọc, dữ liệu sẽ trở nên trống và câu lệnh break sẽ chấm dứt vòng lặp trong khi. Phương pháp này cũng hữu ích trong việc đọc một tệp nhị phân như hình ảnh, pdf, tài liệu từ, v.v ... Dưới đây là một đoạn mã đơn giản để tạo một bản sao của tệp.

with open(destination_file_name, 'w') as out_file:
    with open(source_file_name) as in_file:
        for line in in_file:
            out_file.write(line)

Tham khảo: Câu hỏi về Stackoverflow: StackOverflow Question