Nhầm lẫn bởi chế độ tập tin python Làm thế nào


201

Từ tài liệu ,

Các chế độ 'r +', 'w +' và 'a +' mở tệp để cập nhật (lưu ý rằng 'w +' cắt ngắn tệp). Nối 'b' vào chế độ để mở tệp ở chế độ nhị phân, trên các hệ thống phân biệt giữa tệp nhị phân và tệp văn bản; trên các hệ thống không có sự khác biệt này, việc thêm 'b' không có hiệu lực.

ở đây

w +: Mở một tệp cho cả viết và đọc. Ghi đè tệp hiện có nếu tệp tồn tại. Nếu tệp không tồn tại, tạo một tệp mới để đọc và viết.

Nhưng, làm thế nào để đọc một tập tin mở với w+?


27
Tôi thấy sơ đồ này khá hữu ích.
Ritwik

Câu trả lời:


132

Giả sử bạn đang mở tệp với một withtuyên bố như bạn nên làm. Sau đó, bạn sẽ làm một cái gì đó như thế này để đọc từ tệp của bạn:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

Lưu ý f.seek(0)- nếu bạn quên điều này, f.read()cuộc gọi sẽ cố đọc từ cuối tệp và sẽ trả về một chuỗi trống.


1
"cắt ngắn thành 0 byte" nghĩa là gì?
Nasif Imtiaz Ohi

22
@NasifImtiazOhi - Các tài liệu Python nói rằng w+sẽ "ghi đè lên tệp hiện có nếu tệp tồn tại". Vì vậy, ngay sau khi bạn mở một tệp với w+, bây giờ nó là một tệp trống: nó chứa 0 byte. Nếu nó được sử dụng để chứa dữ liệu, dữ liệu đó đã bị cắt ngắn - bị cắt và vứt đi - và bây giờ kích thước tệp là 0 byte, vì vậy bạn không thể đọc bất kỳ dữ liệu nào tồn tại trước khi bạn mở tệp w+. Nếu bạn thực sự muốn đọc dữ liệu trước đó và thêm vào nó, bạn nên sử dụng r+thay vì w+.
rmunn

Làm thế nào để thêm dữ liệu mới trên đầu trang?
Beqa Bukhradze

1
@BeqaBukhradze - Nếu bạn có câu hỏi, hãy nhấp vào nút "Đặt câu hỏi", nơi hàng trăm người sẽ nhìn thấy nó. Đừng chỉ nhấp vào nút "Thêm bình luận" trong đó chỉ có một hoặc hai người sẽ nhìn thấy nó.
rmunn

430

Dưới đây là danh sách các chế độ mở tệp khác nhau:

  • r

    Mở một tệp để chỉ đọc. Con trỏ tệp được đặt ở đầu tệp. Đây là chế độ mặc định.

  • rb

    Mở một tệp để chỉ đọc ở định dạng nhị phân. Con trỏ tệp được đặt ở đầu tệp. Đây là chế độ mặc định.

  • r +

    Mở một tập tin cho cả đọc và viết. Con trỏ tệp sẽ ở đầu tệp.

  • rb +

    Mở một tệp cho cả đọc và viết ở định dạng nhị phân. Con trỏ tệp sẽ ở đầu tệp.

  • w

    Mở một tệp chỉ để viết. Ghi đè tập tin nếu tập tin tồn tại. Nếu tệp không tồn tại, tạo một tệp mới để ghi.

  • wb

    Mở một tệp để chỉ viết ở định dạng nhị phân. Ghi đè tập tin nếu tập tin tồn tại. Nếu tệp không tồn tại, tạo một tệp mới để ghi.

  • w +

    Mở một tập tin cho cả viết và đọc. Ghi đè tệp hiện có nếu tệp tồn tại. Nếu tệp không tồn tại, tạo một tệp mới để đọc và viết.

  • wb +

    Mở một tệp cho cả viết và đọc ở định dạng nhị phân. Ghi đè tệp hiện có nếu tệp tồn tại. Nếu tệp không tồn tại, tạo một tệp mới để đọc và viết.

  • một

    Mở một tập tin để nối thêm. Con trỏ tệp nằm ở cuối tệp nếu tệp tồn tại. Đó là, tập tin ở chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để ghi.

  • ab

    Mở một tệp để nối thêm ở định dạng nhị phân. Con trỏ tệp nằm ở cuối tệp nếu tệp tồn tại. Đó là, tập tin ở chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để ghi.

  • a +

    Mở một tệp cho cả nối và đọc. Con trỏ tệp nằm ở cuối tệp nếu tệp tồn tại. Các tập tin mở trong chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi.

  • ab +

    Mở một tệp cho cả nối thêm và đọc ở định dạng nhị phân. Con trỏ tệp nằm ở cuối tệp nếu tệp tồn tại. Các tập tin mở trong chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi.


vậy đối với tất cả các mục đích chuyên sâu, r + và w + có giống nhau không?
Nick Humrich

21
@Humdinger: Không, w+tạo một tệp mới hoặc cắt bớt một tệp hiện có, sau đó mở nó để đọc và viết; r+mở một tập tin hiện có mà không cắt bớt nó để đọc và viết. Rất khác nhau.
abarnert

Ngoài ra, như với câu trả lời của @ AlokAgarwal, đây là một danh sách đầy đủ các chế độ, nhưng không phải.
abarnert

1
Sẽ là khá ngớ ngẩn khi đưa ra một danh sách đầy đủ các chế độ, vì chúng hoạt động giống như một chức năng với nhiều tham số. r, whoặc alà độc quyền, nhưng bcó thể được thêm vào bất kỳ trong số đó, như có thể +, hoặc U... Đó là một vụ nổ tổ hợp.
rmunn

4
rbkhông phải là chế độ mặc định, trích dẫn: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/l Library / fiances.html
iggy

158

Tất cả các chế độ tệp trong Python

  • r để đọc
  • r+ mở để đọc và viết (không thể cắt một tập tin)
  • w để viết
  • w+ để viết và đọc (có thể cắt một tập tin)
  • rbđể đọc một tệp nhị phân. Con trỏ tệp được đặt ở đầu tệp.
  • rb+ đọc hoặc viết một tập tin nhị phân
  • wb+ viết một tệp nhị phân
  • a+ mở để nối thêm
  • ab+Mở một tệp cho cả nối thêm và đọc ở dạng nhị phân. Con trỏ tệp nằm ở cuối tệp nếu tệp tồn tại. Các tập tin mở trong chế độ chắp thêm.
  • x mở để tạo độc quyền, không thành công nếu tệp đã tồn tại (Python 3)

5
Đây không phải là tất cả các chế độ. Nó bỏ qua, ví dụ, rbwb, không đề cập đến các Uchế độ trong 2.x và tchế độ trong 3.x (cả hai có thể được kết hợp với mọi thứ trừ b).
abarnert

1
Sự khác biệt giữa r + và w + là w + cắt bớt một tệp khi nó được mở. Nhưng bạn có thể cắt nó bằng tay trong cả hai chế độ.
Martin

1
Câu trả lời này không phù hợp với câu trả lời của @ 200 OK, ví dụ như wb+cũng đọc từ tệp?
Celeritas

@Celeritas Wb chỉ ra rằng tệp được mở để ghi ở chế độ nhị phân. Trên các hệ thống Unix (Linux, Mac OS X, v.v.), chế độ nhị phân không làm gì cả - chúng xử lý các tệp văn bản giống như bất kỳ tệp nào khác được xử lý. Tuy nhiên, trên Windows, các tệp văn bản được viết với các kết thúc dòng được sửa đổi một chút. Điều này gây ra một vấn đề nghiêm trọng khi xử lý các tệp nhị phân thực tế, như các tệp exe hoặc jpg. Do đó, khi mở các tệp không được coi là văn bản, ngay cả trong Unix, bạn nên sử dụng wb hoặc rb. Chỉ sử dụng w hoặc r đơn giản cho các tệp văn bản.
Alok Agarwal

Trong Python 3, cũng có chế độ mở 'x': mở để tạo độc quyền, không thành công nếu tệp đã tồn tại. Xem chức năng mở trong tài liệu.
Laurent LAPORTE

9

r để đọc

w để viết

r+ để đọc / ghi mà không xóa nội dung gốc nếu tệp tồn tại, nếu không sẽ tăng ngoại lệ

w+ để xóa nội dung gốc, sau đó đọc / ghi nếu tệp tồn tại, nếu không thì tạo tệp

Ví dụ,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'

>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

Tệp bị cắt ngắn, do đó bạn có thể gọi read()(không có ngoại lệ nào được nêu ra, không giống như khi được mở bằng 'w') nhưng bạn sẽ nhận được một chuỗi trống.


2

Tôi nghi ngờ có hai cách để xử lý những gì tôi nghĩ bạn đang cố gắng đạt được.

1) đó là điều hiển nhiên, là mở tệp chỉ để đọc, đọc nó vào bộ nhớ, sau đó mở tệp bằng t, sau đó viết các thay đổi của bạn.

2) sử dụng các thói quen xử lý tệp cấp thấp:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

Hi vọng điêu nay co ich..


Vậy thì để làm gì r+
SmartManoj

1

Trên thực tế, có điều gì đó sai về tất cả các câu trả lời khác về r+chế độ.

test.in nội dung tập tin

hello1
ok2
byebye3

Và kịch bản py:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

Thực thi nó và test.innội dung của sẽ được thay đổi thành:

hello1
ok2
byebye3
addition

Tuy nhiên, khi chúng tôi sửa đổi tập lệnh thành:

with open("test.in", 'r+')as f:
    f.write("addition")

những test.incũng làm phản ứng:

additionk2
byebye3

Vì vậy, r+chế độ sẽ cho phép chúng tôi bao quát nội dung ngay từ đầu nếu chúng tôi không thực hiện thao tác đọc. Và nếu chúng ta thực hiện một số thao tác đọc, f.write()sẽ chỉ thêm vào tệp.

Nhân tiện, nếu chúng ta f.seek(0,0)trước đó f.write(write_content), write_content sẽ bao phủ chúng từ positon (0,0).


0

Như h4z3 đã đề cập , Để sử dụng thực tế, Đôi khi dữ liệu của bạn quá lớn để tải trực tiếp mọi thứ hoặc bạn có một trình tạo hoặc dữ liệu đến theo thời gian thực, bạn có thể sử dụng w + để lưu trữ trong tệp và đọc sau.

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.