Python записывать байты в файл

156

У меня есть функция, которая возвращает строку. Строка содержит символы возврата каретки и перевода строки (0x0D, 0x0A). Однако, когда я пишу в файл, он содержит только новые переводы строк. Есть ли способ получить вывод, включающий возврат каретки и новый перевод строки.

msg = function(arg1, arg2, arg3)
f = open('/tmp/output', 'w')
f.write(msg)
f.close()
Blackninja543
источник
прочтитеfile.__doc__
wim

Ответы:

277

Если вы хотите записывать байты, вам следует открыть файл в двоичном режиме.

f = open('/tmp/output', 'wb')
Игнасио Васкес-Абрамс
источник
8
Поскольку OP, похоже, использует платформу, отличную от Windows, это работает только в Py3. В Py2 вам нужно будет использовать io.open.
lvc
2
Я думаю, что это ошибка самого python, учитывая, что python может обнаруживать типы данных во время выполнения и может обнаруживать между двоичным и текстовым вводом, я думаю, что это должно быть исправлено в самом python, почему сотни людей попадают на эту страницу, если этого можно было избежать с помощью оператора if в stdlib python, проголосовать за, если вы согласны, или за меня, сделать забвение, если нужно.
Фелипе Вальдес
2
@FelipeValdes, к сожалению, может преподнести сюрпризы при написании контента, если он когда-либо будет обнаружен неправильно. Еще более досадно то, что это неправильное обнаружение могло произойти только в некоторых странных крайних случаях, которые становятся неожиданными и трудными для отслеживания. Если вместо этого полагаться на явное поведение, даже если это означает, что у нас есть этот вопрос, я могу быть уверен в том, как ввод-вывод ведет себя в различных сценариях.
Лиам Доусон
1
какое расширение было бы у байтовых файлов?
Чиа Юнкан
@FelipeValdes, это относится к принципу наименьшего удивления / удивления ( en.wikipedia.org/wiki/Principle_of_least_astonishment ). Ваш метод был бы более open_and_detect_file_type()
уместным
2

Запишите байты и создайте файл, если он не существует:

f = open('./put/your/path/here.png', 'wb')
f.write(data)
f.close()
yaya
источник
смог создать файл (новый) без +значения, wb+как указано в ответе ur. Так что просто выполните: python with open('data.csv', 'wb') as file_obj: file_obj.write(csv_data) Согласно справке (открыть) в документах REPL и python Py3.7 # чтение и запись файлов
Исаак Филипп,
@IsaacPhilip у меня работает и без +, поэтому обновил ответ.
yaya