Mở tệp ở chế độ 'rt' và 'wt'


108

Vài lần ở đây trên SO, tôi đã thấy mọi người sử dụng rtwtcác chế độ để đọc và ghi tệp.

Ví dụ:

with open('input.txt', 'rt') as input_file:
     with open('output.txt', 'wt') as output_file: 
         ...

Tôi không thấy các chế độ được ghi lại , nhưng vì open()không gây ra lỗi - có vẻ như nó khá hợp pháp để sử dụng.

Nó dùng để làm gì và có sự khác biệt nào giữa việc sử dụng wtvs wrtvs rkhông?

Câu trả lời:


193

tđề cập đến chế độ văn bản. Không có sự khác biệt giữa rrthoặc wwtvì chế độ văn bản là mặc định.

Tài liệu ở đây :

Character   Meaning
'r'     open for reading (default)
'w'     open for writing, truncating the file first
'x'     open for exclusive creation, failing if the file already exists
'a'     open for writing, appending to the end of the file if it exists
'b'     binary mode
't'     text mode (default)
'+'     open a disk file for updating (reading and writing)
'U'     universal newlines mode (deprecated)

Chế độ mặc định là 'r'(mở để đọc văn bản, từ đồng nghĩa của 'rt').


4
Gotcha, nó được ghi lại trong tài liệu python3. Vì vậy, về cơ bản không có sự khác biệt giữa wtvs wrtvs r- chỉ explicit is better than implicit?
alecxe

@alecxe Đúng vậy, kể từ khi chế độ văn bản là mặc định, không có sự khác biệt giữa rrt...
devnull

9
Lưu ý rằng wkhông phải lúc nào cũng bằng wt. Một trong những trường hợp như vậy là gzip.openchế độ nhị phân là mặc định chứ không phải chế độ văn bản. Câu hỏi liên quan: stackoverflow.com/questions/42013083/…
Carl Ekerot

9

Các tchỉ ra chế độ văn bản, có nghĩa là \nnhân vật sẽ được dịch sang kết thúc dòng hệ điều hành máy chủ khi viết vào một tập tin, và ngược lại khi đọc. Cờ về cơ bản chỉ là nhiễu, vì chế độ văn bản là mặc định.

Ngoài ra U, những cờ chế độ đó đến trực tiếp từ fopen()chức năng của thư viện C tiêu chuẩn , một thực tế được ghi lại trong đoạn thứ sáu của tài liệu python2 cho open().

Theo như tôi biết, tkhông phải và chưa bao giờ là một phần của tiêu chuẩn C, vì vậy mặc dù nhiều triển khai của thư viện C chấp nhận nó, không có gì đảm bảo rằng tất cả chúng đều sẽ làm như vậy và do đó không có gì đảm bảo rằng nó sẽ hoạt động trên mọi bản dựng của con trăn. Điều đó giải thích tại sao tài liệu python2 không liệt kê nó và tại sao nó vẫn hoạt động bình thường. Tài liệu python3 làm cho nó chính thức.


4

'R' là để đọc, 'w' để viết và 'a' là để thêm vào.

Chữ 't' đại diện cho chế độ văn bản được áp dụng cho chế độ nhị phân.

Vài lần ở đây trên SO, tôi đã thấy mọi người sử dụng chế độ rt và wt để đọc và ghi tệp.

Chỉnh sửa: Bạn có chắc là bạn đã thấy rt chứ không phải rb không?

Các hàm này thường bao bọc hàm fopen được mô tả ở đây:

http://www.cplusplus.com/reference/cstdio/fopen/

Như bạn có thể thấy, nó đề cập đến việc sử dụng b để mở tệp ở chế độ nhị phân.

Liên kết tài liệu bạn cung cấp cũng tham chiếu đến chế độ b này:

Việc thêm 'b' hữu ích ngay cả trên các hệ thống không xử lý tệp nhị phân và tệp văn bản khác nhau, nơi nó được dùng làm tài liệu.


Vâng, rõ ràng là rtnhư vậy, ví dụ: stackoverflow.com/questions/10971033/… hoặc stackoverflow.com/questions/17127853/…, v.v. Cảm ơn bạn đã cung cấp thông tin, rất vui được biết.
alecxe

Trong liên kết mà devnull cung cấp, tùy chọn văn bản 't' được liệt kê. Điều làm tôi ngạc nhiên là liên kết C ++ cũng không đề cập đến tùy chọn 't' đó vì tôi khá chắc rằng mình đã sử dụng tùy chọn 'rt' và 'wt' trong mã C fopen được viết nhiều năm trước.
jussij

Vâng, đó là lý do tại sao tôi đã hỏi - đối với tôi nó giống như một tính năng không có tài liệu. Hy vọng chủ đề sẽ giúp một ai đó trong tương lai. Cảm ơn một lần nữa.
alecxe

3

t chỉ ra cho text mode

https://docs.python.org/release/3.1.5/library/functions.html#open

trên linux, không có sự khác biệt giữa chế độ văn bản và chế độ nhị phân, tuy nhiên, trong windows, chúng chuyển đổi \nthành \r\nchế độ văn bản khi.

http://www.cygwin.com/cygwin-ug-net/using-textbinary.html


5
Trong Python 3, có một sự khác biệt bổ sung giữa chế độ tệp văn bản và tệp nhị phân (trên tất cả các nền tảng). Trong chế độ văn bản, readtrả về chuỗi Unicode. Trong chế độ nhị phân, readtrả về một bytesthể hiện. Nếu bạn muốn viết mã Python 2 có lưu ý đến khả năng tương thích chuyển tiếp, bạn có thể sử dụng io.openthay vì tiêu chuẩn openđể có được hành vi Python 3 (với phiên bản unicodeso với strphiên bản).
Blckknght
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.