Nhưng đó có phải là một giải pháp tốt?
Vì vậy, tốt hơn hết là luôn kiểm tra sự tồn tại của tệp trước khi đọc/ghi tệp
- Lần thử thứ 2. Kiểm tra sự tồn tại của tệp
import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Giải pháp này có đủ tốt không?
Trong trường hợp này, lựa chọn tốt hơn là sử dụng
import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
with open[file_path, 'rb'] as f:
for line in f.readlines[]:
print[line]
6 để bao bọc thao tác tệp, để nó tự động đóng tệp bất kể thao tác thành công hay thất bại- Lần thử thứ 3. sử dụng
6import os file_path = './i-am-a-very-large-file' if[os.path.isfile[file_path]]: with open[file_path, 'rb'] as f: for line in f.readlines[]: print[line]
import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
with open[file_path, 'rb'] as f:
for line in f.readlines[]:
print[line]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Đây có phải là giải pháp hoàn hảo?
Trong hầu hết các trường hợp, vâng, nó đủ để xử lý thao tác tệp
Tuy nhiên, nếu bạn cần đọc một tệp rất rất rất lớn, chẳng hạn như tệp 4GB thì sao? . Nếu đây là một API trong máy chủ của bạn và một số yêu cầu đến để đọc nhiều tệp lớn, thì bạn cần bao nhiêu bộ nhớ, 16GB, 32GB, 64GB, chỉ cho một thao tác tệp đơn giản?
Chúng ta có thể làm một thí nghiệm rất đơn giản trong môi trường Window. Đầu tiên, hãy tạo 4GB với tập lệnh sau
import os
size = 1024*1024*1024*4 # 4GB
with open['i-am-a-very-large-file', "wb"] as f:
f.write[os.urandom[size]]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Bây giờ bạn có một tệp lớn 4GB và hãy ghi lại thống kê bộ nhớ hiện tại của chúng tôi bằng trình quản lý tác vụ Windows
Từ ảnh chụp màn hình, nó cho thấy quá trình
import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
1 sử dụng bộ nhớ 5.154.136 KB, tức là khoảng 5. Bộ nhớ 19 GB, chỉ để đọc tệp này mà thôi. Bạn có thể thấy rõ đường dốc tăng dần từ sơ đồ bộ nhớ. [Thông tin cho bạn biết, tôi có tổng bộ nhớ 24 GB]Do đó, để làm cho giải pháp của chúng tôi tốt hơn, chúng tôi phải nghĩ ra cách tối ưu hóa nó. Giá như chúng ta có thể đọc dòng này trong khi chúng ta thực sự muốn sử dụng nó
Ở đây có khái niệm về trình tạo và chúng ta có thể có giải pháp sau
- Lần thử thứ 4. sử dụng
2import os file_path = './i-am-a-very-large-file' if[os.path.isfile[file_path]]: f = open[file_path, 'rb'] for line in f.readlines[]: print[line] f.close[]
import os
def read_file[f_path]:
BLOCK_SIZE = 1024
if[os.path.isfile[f_path]]:
with open[file_path, 'rb'] as f:
while True:
block = f.read[BLOCK_SIZE]
if block:
yield block
else:
return
file_path = './i-am-a-very-large-file'
for line in read_file[file_path]:
print[line]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Và hãy chạy nó và theo dõi sự thay đổi bộ nhớ
vâng. Trong khi bảng điều khiển điên cuồng in các văn bản vô nghĩa, mức sử dụng bộ nhớ cực kỳ thấp so với phiên bản trước, tổng cộng chỉ 2.928 KB. Và đó là một đường hoàn toàn bằng phẳng trong sơ đồ bộ nhớ
Tại sao nó lại nhanh và an toàn với bộ nhớ đến vậy?
Để hiểu cách thức hoạt động của
import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
2, chúng ta cần biết khái niệm về trình tạo. Đây là một lời giải thích rất rõ ràng và ngắn gọn về nó, hãy xem Từ khóa “yield” làm gì? Tóm lại,
import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
2 chỉ cần biến hàm import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
6 này thành hàm tạo. Khi import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
6 được gọi, nó sẽ chạy cho đến khi import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
8, trả về khối chuỗi đầu tiên và dừng cho đến khi hàm được gọi lần sau. Vì vậy, chỉ có một khối tệp được đọc mỗi khi import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
9 được gọiĐể đọc toàn bộ tệp,
import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
f = open[file_path, 'rb']
for line in f.readlines[]:
print[line]
f.close[]
9 cần gọi [import os
file_path = './i-am-a-very-large-file'
if[os.path.isfile[file_path]]:
with open[file_path, 'rb'] as f:
for line in f.readlines[]:
print[line]
1] nhiều lần và mỗi lần nó chỉ tiêu tốn một ít bộ nhớ để đọc một khốiVì vậy, đó là cách mở tệp trong python như một người chuyên nghiệp, được cân nhắc về các trường hợp cực đoan [thực sự khá phổ biến nếu dịch vụ của bạn quan trọng về hiệu suất]. Hy vọng bạn thích bài đăng trên blog này và chia sẻ ý tưởng của bạn ở đây
Bạn có thể lấy mã nguồn demo trên GitHub tại đây. ZhiyueYi/how-to-open-a-file-in-python-like-a-pro-demo