'Wb' có nghĩa là gì trong mã này, bằng cách sử dụng Python?


107

Mã:

file('pinax/media/a.jpg', 'wb')

Ngoài ra bạn nên cân nhắc sử dụng openthay thế file. filekhông được chấp nhận trong Python 2 (không thể tìm thấy phiên bản nào) và đã bị xóa trong py3k. (cảm ơn Scott) Xem câu hỏi này để biết thêm thông tin.
Luiz Damim

1
Sử dụng openthay vì filekhông được dùng nữa trong Python 2 và bị xóa trong Python 3. Xem stackoverflow.com/questions/112970/…
Max Ghenis

2
Sẽ không thực sự công bằng nếu cho rằng đó là mã riêng của OP, đặc biệt là với bản chất của câu hỏi. Nó rõ ràng là hợp lệ tại một thời điểm.
mckenzm

Câu trả lời:


112

Chế độ tệp , ghi và nhị phân. Vì bạn đang viết tệp .jpg, nên nó có vẻ ổn.

Nhưng nếu bạn muốn đọc tệp jpg đó, bạn cần sử dụng 'rb'

Thêm thông tin

Trên Windows, 'b' được thêm vào chế độ sẽ mở tệp ở chế độ nhị phân, vì vậy cũng có các chế độ như 'rb', 'wb' và 'r + b'. Python trên Windows phân biệt giữa tệp văn bản và tệp nhị phân; các ký tự cuối dòng trong tệp văn bản được tự động thay đổi một chút khi dữ liệu được đọc hoặc ghi. Việc sửa đổi hậu trường này đối với dữ liệu tệp 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ư trong tệp JPEG hoặc EXE.


4
Cụ thể, trong Windows, tệp được mở ở chế độ văn bản, fd.write("foo\n")thực sự ghi trên đĩa foo\r\n(lưu ý \r).
Serge Ballesta

4
Tôi khá chắc chắn 'b' mở tệp ở chế độ nhị phân trên mọi nền tảng, không chỉ Windows hoặc sẽ có một cảnh báo rất lớn ở đây.
mckenzm

76

Dấu wbchỉ ra rằng tệp được mở để ghi ở chế độ nhị phân.

Khi viết ở chế độ nhị phân, Python không thực hiện thay đổi nào đối với dữ liệu khi nó được ghi vào tệp. Tuy nhiên, ở chế độ văn bản (khi bbị loại trừ như chỉ whoặc khi bạn chỉ định chế độ văn bản với wt), Python sẽ mã hóa văn bản dựa trên mã hóa văn bản mặc định. Ngoài ra, Python sẽ chuyển đổi phần cuối dòng ( \n) thành bất kỳ phần cuối dòng cụ thể của nền tảng nào, điều này sẽ làm hỏng tệp nhị phân như tệp exehoặc pngtệp.

Do đó, chế độ văn bản nên được sử dụng khi viết tệp văn bản (cho dù sử dụng văn bản thuần túy hay định dạng dựa trên văn bản như CSV), trong khi chế độ nhị phân phải được sử dụng khi viết tệp không phải văn bản như hình ảnh.

Người giới thiệu:

https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files https://docs.python.org/3/library/functions.html#open


1
Điều này có thể đã thay đổi theo thời gian. Trên Ubuntu 18.04 chạy Python 3.6.8, 'chế độ nhị phân' chắc chắn rất quan trọng. Tôi đã gặp lỗi khi cố gắng ghi vào tệp văn bản (định dạng CSV, không phải là định dạng cuối cùng quan trọng như vậy) được mở bằng wbtùy chọn. Bằng cách sử dụng wtùy chọn thay thế, tôi đã có thể làm cho nó hoạt động bình thường.
TheDavidJohnson

1
Cảm ơn nhận xét của bạn @TheDavidJohnson. Quay lại Python 2.6, các tài liệu nói rằng bchế độ này chỉ có tác dụng trên Windows. Điều đó hiện đã được xóa khỏi tài liệu và chế độ nhị phân "sẽ được sử dụng cho tất cả các tệp không chứa văn bản".
Daniel G

1
Chắc chắn rồi, @Daniel! Tôi đánh giá cao bạn đăng giải pháp của bạn. Hơn 9 năm sau, nó vẫn hữu ích. Điều đó tuyệt vời như thế nào? Trong mọi trường hợp, tôi chỉ muốn thêm một số thông tin mới cho những người khác như tôi, những người có thể vẫn đến và thấy điều này hữu ích. Chúc mừng!
TheDavidJohnson

Lời giải thích tuyệt vời. Tuy nhiên, có một giải thích rõ ràng: bạn nói "Chế độ văn bản nên được sử dụng khi viết tệp văn bản" . Để đầy đủ, tôi muốn tham khảo lại nhận xét trước đó của bạn rằng "Python không tạo ra thay đổi nào [ở chế độ nhị phân]" và thêm rằng bạn sẽ sử dụng chế độ nhị phân trên tệp văn bản khi không biết (hoặc quan tâm) mã hóa là gì nhưng chỉ cần đọc hoặc ghi các byte, hoặc nếu bạn muốn giữ nguyên phần cuối dòng bất kể nền tảng.
pcdev

8

Đó là chế độ mà bạn đang mở tệp. "wb" có nghĩa là bạn đang ghi vào tệp (w) và bạn đang ghi ở chế độ nhị phân (b).

Kiểm tra tài liệu để biết thêm: clicky

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.