Apa arti 'wb' dalam kode ini, menggunakan Python?

107

Kode:

file('pinax/media/a.jpg', 'wb')
zjm1126
sumber
Juga Anda harus mempertimbangkan menggunakan openbukan file. filetidak digunakan lagi di Python 2 (tidak dapat menemukan versi mana) dan telah dihapus di py3k. (terima kasih Scott) Lihat pertanyaan ini untuk info lebih lanjut.
Luiz Damim
1
Gunakan openalih-alih file, yang tidak digunakan lagi di Python 2 dan dihapus dengan Python 3. Lihat stackoverflow.com/questions/112970/…
Max Ghenis
2
Tidaklah adil untuk mengasumsikan bahwa itu adalah kode OP sendiri, terutama mengingat sifat pertanyaannya. Itu jelas valid pada satu waktu.
mckenzm

Jawaban:

112

Mode file , tulis dan biner. Karena Anda sedang menulis file .jpg, sepertinya baik-baik saja.

Tetapi jika Anda seharusnya membaca file jpg itu, Anda perlu menggunakan 'rb'

Info lebih lanjut

Pada Windows, 'b' ditambahkan ke mode membuka file dalam mode biner, jadi ada juga mode seperti 'rb', 'wb', dan 'r + b'. Python di Windows membuat perbedaan antara file teks dan biner; karakter akhir baris dalam file teks secara otomatis diubah sedikit ketika data dibaca atau ditulis. Modifikasi di balik layar ke file data ini baik-baik saja untuk file teks ASCII, tetapi itu akan merusak data biner seperti itu di file JPEG atau EXE.

KAMU
sumber
4
Konkretnya, di Windows untuk file yang dibuka dalam mode teks, fd.write("foo\n")sebenarnya menulis pada disk foo\r\n(perhatikan \r).
Serge Ballesta
4
Saya cukup yakin 'b' membuka file dalam mode biner di setiap platform, bukan hanya Windows atau akan ada peringatan besar di sini juga.
mckenzm
76

The wbmenunjukkan bahwa file dibuka untuk menulis dalam modus biner.

Saat menulis dalam mode biner, Python tidak mengubah data seperti yang tertulis di file. Dalam mode teks (ketika bdikecualikan seperti hanya watau ketika Anda menentukan mode teks dengan wt), bagaimanapun, Python akan menyandikan teks berdasarkan pengkodean teks default. Selain itu, Python akan mengonversi akhiran baris ( \n) menjadi apa pun akhir baris khusus platform, yang akan merusak file biner seperti exeatau pngfile.

Oleh karena itu mode teks harus digunakan saat menulis file teks (baik menggunakan teks biasa atau format berbasis teks seperti CSV), sedangkan mode biner harus digunakan saat menulis file non-teks seperti gambar.

Referensi:

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

Daniel G
sumber
1
Ini mungkin telah berubah seiring waktu. Di Ubuntu 18.04 yang menjalankan Python 3.6.8, 'mode biner' sangat penting. Saya mendapat kesalahan saat mencoba menulis ke file teks (format CSV, bukan karena itu sangat penting) yang dibuka dengan wbopsi. Dengan menggunakan wopsi ini, saya bisa membuatnya berfungsi dengan baik.
TheDavidJohnson
1
Terima kasih atas komentar Anda @TheDavidJohnson. Kembali ke Python 2.6, dokumen mengatakan bahwa bmode hanya berpengaruh pada Windows. Itu sekarang telah dihapus dari dokumentasi dan mode biner "harus digunakan untuk semua file yang tidak berisi teks".
Daniel G
1
Tentu, @Daniel! Saya menghargai Anda memposting solusi Anda. Lebih dari 9 tahun kemudian, ini masih membantu. Seberapa hebat itu? Bagaimanapun, saya hanya ingin menambahkan beberapa info baru untuk orang lain seperti saya yang mungkin masih datang dan menganggap ini berguna. Bersulang!
TheDavidJohnson
Penjelasan yang bagus. Namun, satu klarifikasi: Anda mengatakan "Karena itu mode teks harus digunakan saat menulis file teks" . Untuk kelengkapan, saya akan merujuk kembali ke komentar Anda sebelumnya bahwa "Python tidak membuat perubahan [dalam mode biner]", dan menambahkan bahwa Anda akan menggunakan mode biner pada file teks ketika tidak tahu (atau peduli) apa pengkodeannya tetapi hanya perlu membaca atau menulis byte, atau jika Anda ingin mempertahankan akhir baris apa pun platformnya.
pcdev
8

Itu adalah mode yang Anda gunakan untuk membuka file. "wb" berarti Anda menulis ke file (w), dan Anda menulis dalam mode biner (b).

Lihat dokumentasi untuk lebih lanjut: clicky

GlenCrawford
sumber