2010-04-19 20 views

Trả lời

65

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

Nhưng nếu bạn phải đọc rằng tập tin jpg bạn cần phải sử dụng 'rb'

Thông tin thêm

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

+3

Cụ thể, trong Windows cho một 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'). –

3

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

Kiểm tra các tài liệu hướng dẫn để biết thêm: clicky

38

Các wb chỉ ra rằng các tập tin được mở ra cho các văn bản trong chế độ nhị phân.

Trên 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ư cách mọi tệp khác được xử lý. Tuy nhiên, trên Windows, các tệp văn bản được viết bằng 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, 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 đồng bằng w hoặc r chỉ dành cho tệp văn bản.

tham khảo: http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files

4

Ngoài ra bạn nên xem xét sử dụng open thay vì file. file không còn được dùng 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 this question để biết thêm thông tin.

+1

Câu trả lời này có lẽ sẽ tốt hơn như một bình luận cho câu trả lời đầu tiên. –

+2

Sử dụng 'tệp' thay vì' mở' đã không còn được dùng trong Python 2 trong một thời gian nữa. Nó đã được * gỡ bỏ * từ Python 3. –

+0

@Scott: cảm ơn, đã chỉnh sửa câu trả lời của tôi. @brian: bạn nói đúng, tôi sẽ làm điều này lần sau, cảm ơn. –

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