Также вам следует подумать об использовании openвместо file. fileустарел в Python 2 (не удалось найти версию) и был удален в py3k. (спасибо Скотту) См. этот вопрос для получения дополнительной информации.
Было бы несправедливо предполагать, что это собственный код OP, особенно с учетом характера вопроса. Одно время это было очевидно.
mckenzm
Ответы:
113
Файловый режим , запись и двоичный. Поскольку вы пишете файл .jpg, он выглядит нормально.
Но если вы должны прочитать этот файл jpg, вам нужно использовать 'rb'
Больше информации
В Windows добавление «b» к режиму открывает файл в двоичном режиме, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически слегка изменяются при чтении или записи данных. Эта закулисная модификация файловых данных хороша для текстовых файлов ASCII, но повредит двоичные данные, как в файлах JPEG или EXE.
Конкретно, в 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), тогда как двоичный режим должен использоваться при записи нетекстовых файлов, таких как изображения.
Это могло измениться со временем. В 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
open
вместоfile
.file
устарел в Python 2 (не удалось найти версию) и был удален в py3k. (спасибо Скотту) См. этот вопрос для получения дополнительной информации.open
вместоfile
, который был устаревшим в Python 2 и удалены в Python 3. См stackoverflow.com/questions/112970/...Ответы:
Файловый режим , запись и двоичный. Поскольку вы пишете файл .jpg, он выглядит нормально.
Но если вы должны прочитать этот файл jpg, вам нужно использовать
'rb'
Больше информации
источник
fd.write("foo\n")
фактически записывается на дискfoo\r\n
(обратите внимание на\r
).Значок
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
источник
wb
опцией. Используяw
вместо этого эту опцию, я смог заставить ее работать правильно.b
режим влияет только на Windows. Теперь это было удалено из документации, и двоичный режим «должен использоваться для всех файлов, не содержащих текст».Это режим, в котором вы открываете файл. «wb» означает, что вы пишете в файл (w), и что вы пишете в двоичном режиме (b).
Ознакомьтесь с документацией, чтобы узнать больше: clicky
источник