[...] Если я хочу получить строку, содержащую 5
blockquote >\
, должен ли я писать 10\
[...]Да, вы должны. Чтобы записать одиночную
\
в строке, вы пишете ее как"\\"
.Это связано с тем, что
\
является специальным символом, зарезервированным для escape символом который следует за ним. (Возможно, вы признаете\n
как новую строку.) Также полезно, если вы хотите написать строку, содержащую один файл"
. Вы записываете его как"\""
.Причина, по которой
\\\str
недействительна, заключается в том, что она интерпретируется как\\
(что соответствует одному\
), за которым следует\s
, что недействителен, поскольку «escape-кодs
» не имеет значения.
Спасибо за указатели. Я нашел следующую реализацию на основе ответа и ссылки @ GiacomoCatenazzi:
# -*- coding: utf-8 -*-
import sys
import codecs
with open("testinput.txt", "r") as ifile:
lines = ifile.read()
with open("testout1.txt", "w") as ofile:
for line in lines:
ofile.write(line)
UTF8Reader = codecs.getreader('utf-8')
sys.stdin = UTF8Reader(sys.stdin)
with open("testout2.txt", "w") as ofile:
for line in sys.stdin:
ofile.write(line.encode('utf-8'))
Однако я не уверен, почему необходимо снова кодировать после использования codecs.getreader
?
Пол [ 114]
Причина в том, что вы взяли короткий путь, который никогда не следует делать.
Вы должны всегда определять кодировку. Поэтому, когда вы читаете файл, вы должны указать, что вы читаете UTF-8 или когда-либо еще. Или просто укажите, что вы читаете двоичные файлы.
В вашем случае интерпретатор python будет использовать UTF-8 в качестве стандартной кодировки при чтении из файлов, потому что это по умолчанию в Linux и macos.
Но когда вы читаете из стандартного ввода, значение по умолчанию определяется кодировкой локали или переменной среды.
Я имею в виду Как изменить кодировку stdin на python , как решить. Этот ответ просто для объяснения причины.