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.
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.
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.
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).
open
bukanfile
.file
tidak 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.open
alih-alihfile
, yang tidak digunakan lagi di Python 2 dan dihapus dengan Python 3. Lihat stackoverflow.com/questions/112970/…Jawaban:
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
sumber
fd.write("foo\n")
sebenarnya menulis pada diskfoo\r\n
(perhatikan\r
).The
wb
menunjukkan 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
b
dikecualikan seperti hanyaw
atau ketika Anda menentukan mode teks denganwt
), 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 sepertiexe
ataupng
file.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
sumber
wb
opsi. Dengan menggunakanw
opsi ini, saya bisa membuatnya berfungsi dengan baik.b
mode hanya berpengaruh pada Windows. Itu sekarang telah dihapus dari dokumentasi dan mode biner "harus digunakan untuk semua file yang tidak berisi teks".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
sumber