Что означает «wb» в этом коде с использованием Python?

107

Код:

file('pinax/media/a.jpg', 'wb')
zjm1126
источник
Также вам следует подумать об использовании openвместо file. fileустарел в Python 2 (не удалось найти версию) и был удален в py3k. (спасибо Скотту) См. этот вопрос для получения дополнительной информации.
Луис Дамим
1
Используйте openвместо file, который был устаревшим в Python 2 и удалены в Python 3. См stackoverflow.com/questions/112970/...
Макс Ghenis
2
Было бы несправедливо предполагать, что это собственный код OP, особенно с учетом характера вопроса. Одно время это было очевидно.
mckenzm

Ответы:

113

Файловый режим , запись и двоичный. Поскольку вы пишете файл .jpg, он выглядит нормально.

Но если вы должны прочитать этот файл jpg, вам нужно использовать 'rb'

Больше информации

В Windows добавление «b» к режиму открывает файл в двоичном режиме, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически слегка изменяются при чтении или записи данных. Эта закулисная модификация файловых данных хороша для текстовых файлов ASCII, но повредит двоичные данные, как в файлах JPEG или EXE.

ТЫ
источник
4
Конкретно, в Windows файл, открытый в текстовом режиме, fd.write("foo\n")фактически записывается на диск foo\r\n(обратите внимание на \r).
Серж Баллеста
4
Я почти уверен, что 'b' открывает файлы в двоичном режиме на любой платформе, а не только в Windows, иначе здесь тоже будет огромное предостережение.
mckenzm
76

Значок wbуказывает, что файл открыт для записи в двоичном режиме.

При записи в двоичном режиме Python не вносит изменений в данные, записанные в файл. Однако в текстовом режиме (когда bисключен, например, просто wили когда вы указываете текстовый режим с помощью wt), Python будет кодировать текст на основе кодировки текста по умолчанию. Кроме того, Python преобразует окончание строки ( \n) в любое окончание строки, зависящее от платформы, что приведет к повреждению двоичного файла, такого как файл exeили png.

Поэтому текстовый режим следует использовать при написании текстовых файлов (будь то обычный текст или текстовый формат, такой как CSV), тогда как двоичный режим должен использоваться при записи нетекстовых файлов, таких как изображения.

Ссылки:

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

Daniel G
источник
1
Это могло измениться со временем. В Ubuntu 18.04 с Python 3.6.8 «двоичный режим» определенно имел значение. У меня возникла ошибка при попытке записи в текстовый файл (формат CSV, но это не так важно), который был открыт с wbопцией. Используя wвместо этого эту опцию, я смог заставить ее работать правильно.
TheDavidJohnson 01
1
Спасибо за ваш комментарий @TheDavidJohnson. Еще в Python 2.6 в документации говорилось, что этот bрежим влияет только на Windows. Теперь это было удалено из документации, и двоичный режим «должен использоваться для всех файлов, не содержащих текст».
Daniel G
1
Конечно, @Daniel! Я ценю, что вы разместили свое решение. Спустя более 9 лет это все еще полезно. Насколько это здорово? В любом случае, я просто хотел добавить новую информацию для таких же людей, как я, которые все еще могут прийти и найти это полезным. Ура!
TheDavidJohnson
Отличное объяснение. Однако одно уточнение: вы говорите: «Поэтому при записи текстовых файлов следует использовать текстовый режим» . Для полноты я вернусь к вашему предыдущему комментарию о том, что «Python не вносит изменений [в двоичном режиме]», и добавлю, что вы будете использовать двоичный режим в текстовом файле, если вы не знаете (или не заботитесь), какая кодировка но просто нужно прочитать или записать байты, или если вы хотите сохранить окончания строк независимо от платформы.
pcdev
8

Это режим, в котором вы открываете файл. «wb» означает, что вы пишете в файл (w), и что вы пишете в двоичном режиме (b).

Ознакомьтесь с документацией, чтобы узнать больше: clicky

GlenCrawford
источник