2013-04-01 36 views
29

Tôi đang sử dụng mô-đun dưa bằng Python và cố gắng tập tin khác nhau IO chế độ:sự khác biệt giữa rb và r + chế độ b trong tập tin là gì đối tượng

# works on windows.. "rb" 
with open(pickle_f, 'rb') as fhand: 
     obj = pickle.load(fhand) 

# works on linux.. "r" 
with open(pickle_f, 'r') as fhand: 
     obj = pickle.load(fhand) 

# works on both "r+b" 
with open(pickle_f, 'r+b') as fhand: 
     obj = pickle.load(fhand) 

Tôi chưa bao giờ đọc về chế độ "r + b" ở bất cứ đâu, nhưng được đề cập đến trong số documentation.

Tôi đang nhận EOFError trên Linux nếu tôi sử dụng chế độ "rb" và trên Windows nếu "r" được sử dụng. Tôi chỉ cho chế độ chụp "r+b" và nó hoạt động trên cả hai.

Chế độ "r+b" là gì? Sự khác nhau giữa "rb" và "r + b" là gì? Tại sao nó hoạt động khi những người khác không?

+0

có thể trùng lặp của [python mở chức năng built-in:? Sự khác biệt giữa các chế độ một, a +, w, w +, và r +] (http://stackoverflow.com/questions/1466000/python-open-built-in-function-differential-between-mode-aaww-and-r) – kay

Trả lời

50

r+ được sử dụng để đọc và chế độ viết. b là nhị phân. Chế độ r+b đang mở tệp nhị phân ở chế độ đọc hoặc ghi.
Bạn có thể đọc thêm here.

+0

vậy tại sao nó hoạt động? – Iamcool

+1

Vui lòng đọc phần này: http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files Nó sẽ trả lời câu hỏi của bạn – karthikr

+0

nếu tôi cấp đặc quyền ghi cho một tệp obj nơi không bắt buộc, điều đó sẽ dẫn đến bất kỳ vấn đề bảo mật nào trong tương lai? – Iamcool

5

Hiểu biết của tôi là thêm r+ mở cho cả đọc và viết (giống như w+, mặc dù như được chỉ ra trong nhận xét, sẽ cắt ngắn tệp). Các b chỉ cần mở nó trong chế độ nhị phân, được cho là ít nhận thức được những thứ như tách dòng (ít nhất là trong C + +).

+4

Nếu tôi không nhầm, "w +" sẽ xóa các tập tin nếu nó tồn tại, và sau đó mở nó để đọc và viết. Nó không giống như "r +". –

+0

Đó là một điểm tốt và đáng nói - cảm ơn! –

12

r mở để đọc, trong khi r+ mở để đọc và viết. b là nhị phân.

này được nêu ra trong documentation:

Các giá trị nhất thường được sử dụng của chế độ là 'r' cho việc đọc, 'w' cho văn bản (cắt bỏ các tập tin nếu nó đã tồn tại), và 'a' cho phụ (mà trên một số hệ thống Unix có nghĩa là tất cả các ghi ghi thêm vào cuối tệp bất kể vị trí tìm kiếm hiện tại). Nếu chế độ bị bỏ qua, chế độ mặc định là 'r'. Mặc định là sử dụng chế độ văn bản, có thể chuyển đổi các ký tự '\n' thành một biểu diễn cụ thể cho nền tảng về viết và đọc lại. Do đó, khi mở một tệp nhị phân, bạn nên thêm 'b' vào giá trị chế độ để mở tệp ở chế độ nhị phân, điều này sẽ cải thiện tính di động. (Phụ thêm 'b' hữu ích ngay cả trên các hệ thống không xử lý các tệp nhị phân và văn bản khác nhau, nơi nó hoạt động dưới dạng tài liệu.) Xem bên dưới để biết thêm các giá trị có thể có của chế độ.

Chế độ 'r+', 'w+''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.

+0

vì vậy, bạn có nghĩa là, 'r + b' sẽ không tạo ra bất kỳ sự khác biệt nào trên Linux nhưng trên cửa sổ .. hơn thế nữa, sự khác biệt giữa" rb "và" r + b "là gì? – Iamcool

+1

Tôi không chắc bạn đọc câu trả lời này một cách cẩn thận, @Iamcool. Nó trả lời tất cả các câu hỏi của bạn. –

2

Trên Windows, 'b' nối vào chế độ mở file trong chế độ nhị phân, vì vậy cũng có các chế độ như 'rb', 'wb', và 'r + b'. Python trên Windows tạo sự khác biệt giữa văn bản và tệp nhị phân; các ký tự cuối cùng của dòng trong các tệp văn bản sẽ tự động bị thay đổi một chút khi dữ liệu được đọc hoặc ghi.Sửa đổi hậu trường này để lưu trữ dữ liệu là tốt cho các tệp văn bản ASCII, nhưng nó sẽ làm hỏng dữ liệu nhị phân như vậy trong các tệp JPEG hoặc EXE. Hãy rất cẩn thận khi sử dụng chế độ nhị phân khi đọc và ghi các tệp đó. Trên Unix, không gây đau khi gắn thêm một 'b' vào chế độ, vì vậy bạn có thể sử dụng nó độc lập với nền tảng cho tất cả các tệp nhị phân .

Nguồn: Reading and Writing Files

Các vấn đề liên quan