Làm thế nào để mở một tập tin cho cả đọc và viết?


210

Có cách nào để mở một tập tin cho cả đọc và viết không?

Như một cách giải quyết, tôi mở tệp để viết, đóng nó, sau đó mở lại để đọc. Nhưng có cách nào để mở một tập tin cho cả đọc và viết không?


3
bạn đang giải quyết vấn đề gì có lẽ có một giải pháp tốt hơn là viết / đọc một tập tin, ví dụmmap
Roman Bodnarchuk

1
Bạn có thể cho chúng tôi mã của bạn để chúng tôi có thể trả lời bạn. Bạn cũng có thể thử xem: docs.python.org/tutorial/ ,. Tuy nhiên tôi đã thử sử dụng r + b và nó hoạt động. Ngoài ra có bất kỳ lợi ích để sử dụng một mô tả tập tin trong các chức năng khác nhau?
Nghệ thuật Rudzenka

@RomanBodnarchuk mmaplà một ý tưởng tuyệt vời, nhưng nếu bạn phải đối phó với sự tương tranh thì sao? Có cách nào để bảo lưu quyền truy cập?
Dr_Zaszuś

Câu trả lời:


267

Đây là cách bạn đọc một tệp, sau đó ghi vào tệp đó (ghi đè bất kỳ dữ liệu hiện có nào), mà không đóng và mở lại:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

41
sử dụng a+để bao gồm trường hợp kết thúc mà tập tin không tồn tại (sẽ được tạo)
Jossef Harush

16
tìm kiếm () và cắt ngắn () đều quan trọng!
smwikipedia

4
@JossefHarush Lưu ý rằng tài liệu cho acác trạng thái 'trên một số hệ thống Unix, có nghĩa là tất cả các ghi đều nối vào cuối tệp bất kể vị trí tìm kiếm hiện tại'. Trong trường hợp này, f.seek(0)sẽ không làm việc như mong đợi. Tôi vừa phạm lỗi này trên Linux.
Graeme

6
Tốt hơn là bạn giải thích tại sao seektruncateđược sử dụng ở đây. Hầu hết các độc giả đến từ google và sao chép-dán.
Shiplu Mokaddim

7
Sau khi bạn đã đọc tệp, con trỏ tệp (fp) đã di chuyển về phía trước, vì vậy bạn cần đặt nó vào đầu. Đó là seek(0): nó đặt fp vào vị trí 0( tức là bắt đầu). truncate()cắt bớt tệp thành số byte được cung cấp, nghĩa là loại bỏ tất cả nội dung tệp sau số byte được chỉ định. Hãy tưởng tượng rằng tập tin của bạn có chuỗi Hello, worldvà bạn viết Bye. Nếu bạn không có truncate()nội dung ở cuối Byelo, world, vì bạn sẽ không bao giờ xóa văn bản tồn tại trong tệp. truncate()cắt ngắn tập tin vào fp hiện tại.
Illya Gerasymchuk

48

r+là chế độ chính tắc để đọc và viết cùng một lúc. Điều này không khác với việc sử dụng lệnh fopen()gọi hệ thống vì file()/ open()chỉ là một trình bao bọc nhỏ xung quanh lệnh gọi hệ điều hành này.


nó chắp thêm nội dung tập tin, không viết từ đầu
TomSawyer

47

Tóm tắt các hành vi I / O

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

và chi nhánh quyết định

nhập mô tả hình ảnh ở đây


Phần mềm nào bạn đã sử dụng để tạo sơ đồ cây?
Flux

Tôi cũng sẽ quan tâm - Dia?
nerdoc

22

Tôi đã thử một cái gì đó như thế này và nó hoạt động như mong đợi:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

Ở đâu:

f.read (size) - Để đọc nội dung của tệp, hãy gọi f.read (size), đọc một số lượng dữ liệu và trả về dưới dạng chuỗi.

Và:

f.write (chuỗi) ghi nội dung của chuỗi vào tệp, trả về Không có.

Ngoài ra nếu bạn mở Python hướng dẫn về đọc và ghi tệp, bạn sẽ thấy rằng:

'r +' mở tệp cho cả đọc và viết.

Trên Windows, 'b' được thêm vào chế độ sẽ mở tệp ở chế độ nhị phân, do đó, cũng có các chế độ như 'rb', 'wb' và 'r + b'.


5
Đồng thời đọc và viết cũng hoạt động tốt như nhau khi sử dụng chế độ 'r + b', nhưng bạn phải sử dụng f.seek (0) giữa f.read () và f.write () để đặt con trỏ trở lại ở đầu tệp.
gabious

2
Lưu ý rằng nếu dữ liệu bạn viết không dài hơn dữ liệu đã có, dữ liệu đó sẽ không bị cắt ngắn. Sử dụng truncatephương pháp để ngăn chặn điều này.
Flimm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.