Использование `print ()` для записи в файл, открытый в двоичном режиме - PullRequest
0 голосов
/ 14 апреля 2019

Я часто использую print() вместо file.write() при записи в файлы на Python. Недавно мне пришлось выписать некоторые двоичные данные и попробовать подобный шаблон:

f = open('test.txt', 'w')
f.write('abcd')
print('efgh', file=f)
f.close()

f = open('test.bin', 'wb')
f.write(b'abcd')  # works as expected
print(b'efgh', file=f)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: a bytes-like object is required, not 'str'
f.close()

Моей первой мыслью было добавление по умолчанию символа новой строки print(), возможно, ошибка:

print(b'efgh', file=f, end='')
# same error
print(b'efgh', file=f, end=None)
# same error
print(b'efgh', file=f, end=b'')
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: end must be None or a string, not bytes
print(b'efgh', file=f, end=b'\n')
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: end must be None or a string, not bytes

К сожалению, ни одна из комбинаций изменения конца не сработала.

Почему это происходит? Я подозреваю, что это использование print() может не поддерживаться, но в этом случае сообщение об ошибке весьма запутанно.

1 Ответ

2 голосов
/ 14 апреля 2019

Из документации по python3: https://docs.python.org/3/library/functions.html#print

Все аргументы, не являющиеся ключевыми словами, преобразуются в строки, как это делает str (), и записываются в поток, разделяются sep и сопровождаются end. И sep, и end должны быть строками; они также могут быть None, что означает использование значений по умолчанию. Если объекты не указаны, print () просто напишет end.

Как я понимаю, вы не можете записать байт с print(), потому что объект, который вы хотите записать, передается только как позиционный аргумент, а позиционные аргументы преобразуются в строки (отсюда и ошибка).

...