Python kullanarak bu kodda 'wb' ne anlama geliyor?


107

Kod:

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

Ayrıca openbunun yerine kullanmayı düşünmelisiniz file. filePython 2'de kullanımdan kaldırıldı (hangi sürümü bulamadı) ve py3k'de kaldırıldı. (teşekkürler Scott) Daha fazla bilgi için bu soruya bakın .
Luiz Damim

1
Python 2'de kullanımdan kaldırılan ve Python 3'te kaldırılan openyerine kullanın . Stackoverflow.com/questions/112970/…file
Max Ghenis

2
Özellikle sorunun doğası göz önüne alındığında, OP'nin kendi kodu olduğunu varsaymak pek adil değil. Belli ki bir zamanlar geçerliydi.
mckenzm

Yanıtlar:


112

Dosya modu , yazma ve ikili. .Jpg dosyası yazdığınız için iyi görünüyor.

Ancak o jpg dosyasını okumanız gerekiyorsa, 'rb'

Daha fazla bilgi

Windows'ta, kipe eklenen 'b', dosyayı ikili kipte açar, dolayısıyla 'rb', 'wb' ve 'r + b' gibi kipler de vardır. Windows üzerinde Python, metin ve ikili dosyalar arasında bir ayrım yapar; metin dosyalarındaki satır sonu karakterleri, veriler okunurken veya yazılırken otomatik olarak biraz değiştirilir. Dosya verilerinde yapılan bu perde arkası değişikliği ASCII metin dosyaları için iyidir, ancak JPEG veya EXE dosyalarındaki gibi ikili verileri bozar.


4
Somut olarak, metin modunda açılan bir dosya için Windows'ta, fd.write("foo\n")aslında diske yazar foo\r\n(not edin \r).
Serge Ballesta

4
'B'nin sadece Windows değil, her platformda ikili kipte dosya açtığından eminim, yoksa burada da çok büyük bir uyarı olurdu.
mckenzm

76

wbDosya ikili modda yazılması için açık olduğunu belirtir.

İkili modda yazarken, Python dosyaya yazılırken verilerde hiçbir değişiklik yapmaz. Metin modunda ( bsadece olduğu gibi hariç tutulduğunda wveya metin modunu ile belirttiğinizde wt), Python metni varsayılan metin kodlamasına göre kodlayacaktır. Ek olarak Python, satır sonlarını ( \n) platforma özgü satır sonu ne olursa olsun, bir exeveya pngdosya gibi ikili bir dosyayı bozacak şekilde dönüştürecektir .

Bu nedenle metin modu, metin dosyaları yazılırken (ister düz metin ister CSV gibi metin tabanlı bir format kullanarak) kullanılmalıdır; ikili mod ise resimler gibi metin olmayan dosyalar yazılırken kullanılmalıdır.

Referanslar:

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


1
Bu zamanla değişmiş olabilir. Python 3.6.8 çalıştıran Ubuntu 18.04'te, 'ikili mod' kesinlikle önemliydi. wbSeçenekle açılan bir metin dosyasına (CSV biçimi, sonuçta o kadar önemli değil) yazmaya çalışırken bir hata aldım . Bunun wyerine seçeneği kullanarak, düzgün çalışmasını sağlayabildim.
TheDavidJohnson

1
Yorumunuz için teşekkürler @TheDavidJohnson. Python 2.6'da, belgeler bmodun yalnızca Windows üzerinde bir etkisi olduğunu söyledi . Bu artık dokümantasyondan kaldırılmıştır ve ikili mod "metin içermeyen tüm dosyalar için kullanılmalıdır".
Daniel G

1
Elbette, @Daniel! Çözümünüzü gönderdiğiniz için teşekkür ederim. 9 yıldan fazla bir süre sonra, hala yararlıdır. Bu ne kadar harika? Her halükarda, benim gibi hala gelip bunu faydalı bulabilecek başkaları için bazı yeni bilgiler eklemek istedim. Şerefe!
TheDavidJohnson

Harika açıklama. Ancak bir açıklama: "Bu nedenle metin dosyası yazarken metin modu kullanılmalıdır" diyorsunuz . Tamlık için, "Python [ikili modda] değişiklik yapmaz" şeklindeki önceki yorumunuza geri dönüp, kodlamanın ne olduğunu bilmediğinizde (veya umursamadığınızda) bir metin dosyasında ikili modu kullanacağınızı ekleyeceğim. ancak baytları okumanız veya yazmanız yeterlidir veya platformdan bağımsız olarak satır sonlarını korumak istiyorsanız.
pcdev

8

Dosyayı açtığınız mod budur. "wb" (w) dosyasına yazdığınız ve ikili modda (b) yazdığınız anlamına gelir.

Daha fazlası için belgelere göz atın: Clicky

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.