Tôi có thể mở cùng một tệp nhiều lần trong python không?

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
    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

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
    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

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ối

Vì 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

Bạn có thể mở một tệp Python đã mở không?

Bạn được phép mở một tệp bao nhiêu lần tùy thích, miễn là hệ điều hành không dừng bạn . Điều này đôi khi hữu ích để đưa nhiều con trỏ vào một tệp cho các hoạt động phức tạp. Lý do mà script_b. py nghĩ rằng tệp trống là tệp trống. với mở ['foo.

Bạn có thể mở cùng một tệp hai lần không?

Trong Word, có thể mở cùng một tệp hai lần để cùng một tài liệu xuất hiện trong hai cửa sổ. Điều này rất hữu ích khi bạn cần tham khảo một phần của tài liệu trong khi bạn đang làm việc trên một phần khác của tài liệu ở nơi khác trong tệp.

Tôi có thể mở một tệp nhiều lần trong C không?

Có, nhưng tại sao bạn không thử? . ] Nếu bạn muốn đọc nhiều offset trong tệp, mmap[] cũng có thể là một tùy chọn, tùy thuộc vào hệ điều hành của bạn . Sau đó, bạn chỉ có thể lập chỉ mục vào tệp bằng địa chỉ bộ nhớ.

Bạn có thể đọc cùng một tệp hai lần trong Java không?

Nếu bạn sử dụng cùng một Trình đọc, mọi thứ đã được đọc khi bạn đến vòng lặp thứ hai . Đóng Reader đầu tiên, sau đó tạo một Reader khác để đọc lần thứ hai.

Chủ Đề