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.
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.
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.
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
open
vez defile
.file
tornou-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.open
vez defile
, que foi descontinuado no Python 2 e removido no Python 3. Consulte stackoverflow.com/questions/112970/…Respostas:
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
fonte
fd.write("foo\n")
na verdade grava no discofoo\r\n
(observe o\r
).O
wb
indica 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 apenasw
ou quando você especifica o modo de texto comwt
), 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 arquivoexe
oupng
.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
fonte
wb
opção. Ao usar aw
opção, consegui fazer com que funcionasse corretamente.b
modo 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".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
fonte