O que 'wb' significa neste código, usando Python?

107

Código:

file('pinax/media/a.jpg', 'wb')
zjm1126
fonte
Além disso, você deve considerar o uso em openvez de file. filetornou-se obsoleto no Python 2 (não foi possível encontrar qual versão) e foi removido no py3k. (obrigado Scott) Veja esta pergunta para mais informações.
Luiz Damim
1
Use em openvez de file, que foi descontinuado no Python 2 e removido no Python 3. Consulte stackoverflow.com/questions/112970/…
Max Ghenis
2
Não é realmente justo presumir que é o próprio código do OP, especialmente dada a natureza da questão. Obviamente, foi válido uma vez.
mckenzm

Respostas:

112

Modo de arquivo , gravação e binário. Como você está escrevendo um arquivo .jpg, parece bom.

Mas se você deveria ler aquele arquivo jpg, você precisa usar 'rb'

Mais informações

No Windows, 'b' anexado ao modo abre o arquivo no modo binário, portanto, também existem modos como 'rb', 'wb' e 'r + b'. Python no Windows faz distinção entre arquivos de texto e binários; os caracteres de fim de linha em arquivos de texto são automaticamente alterados ligeiramente quando os dados são lidos ou gravados. Essa modificação nos bastidores nos dados do arquivo é adequada para arquivos de texto ASCII, mas corromperá os dados binários como os dos arquivos JPEG ou EXE.

VOCÊS
fonte
4
Concretamente, no Windows para um arquivo aberto em modo de texto, fd.write("foo\n")na verdade grava no disco foo\r\n(observe o \r).
Serge Ballesta
4
Tenho certeza de que 'b' abre arquivos em modo binário em todas as plataformas, não apenas no Windows, ou haveria uma enorme advertência aqui também.
mckenzm
76

O wbindica que o arquivo está aberto para gravação em modo binário.

Ao gravar no modo binário, o Python não faz alterações nos dados conforme são gravados no arquivo. No modo de texto (quando o bé excluído como em apenas wou quando você especifica o modo de texto com wt), entretanto, o Python codificará o texto com base na codificação de texto padrão. Além disso, o Python converterá as terminações de linha ( \n) em qualquer que seja a terminação de linha específica da plataforma, o que corromperia um arquivo binário como um arquivo exeou png.

O modo de texto deve, portanto, ser usado ao escrever arquivos de texto (seja usando texto simples ou um formato baseado em texto como CSV), enquanto o modo binário deve ser usado ao escrever arquivos não textuais como imagens.

Referências:

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

Daniel G
fonte
1
Isso pode ter mudado com o tempo. No Ubuntu 18.04 executando Python 3.6.8, o 'modo binário' definitivamente importava. Recebi um erro ao tentar gravar em um arquivo de texto (formato CSV, não que isso importe tanto) que foi aberto com a wbopção. Ao usar a wopção, consegui fazer com que funcionasse corretamente.
TheDavidJohnson
1
Obrigado pelo seu comentário @TheDavidJohnson. De volta ao Python 2.6, os documentos diziam que o bmodo só tinha efeito no Windows. Isso agora foi removido da documentação e o modo binário "deve ser usado para todos os arquivos que não contêm texto".
Daniel G
1
Com certeza, @Daniel! Agradeço por postar sua solução. Mais de 9 anos depois, ainda é útil. Quão bom é isso? Em qualquer caso, eu só queria adicionar algumas informações novas para outras pessoas como eu, que ainda podem vir e achar isso útil. Felicidades!
TheDavidJohnson
Ótima explicação. No entanto, um esclarecimento: você diz "O modo de texto deve, portanto, ser usado ao escrever arquivos de texto" . Para ser mais completo, consulte o seu comentário anterior de que "Python não faz alterações [no modo binário]" e acrescento que você usaria o modo binário em um arquivo de texto quando não souber (ou se importar) qual é a codificação mas só precisa ler ou escrever os bytes, ou se quiser preservar as terminações de linha, independentemente da plataforma.
pcdev
8

Esse é o modo com o qual você está abrindo o arquivo. "wb" significa que você está gravando no arquivo (w) e no modo binário (b).

Confira a documentação para mais informações: clicky

GlenCrawford
fonte