#linux #amazon-ec2 #windows-10 #python-3.7 #codec
Вопрос:
Я запускаю код python, в котором мы читаем файл фиксированной ширины, который мы извлекли с ftp-сервера. код работает в Windows без каких-либо проблем. но когда я запускаю тот же код в экземпляре linux ec2, он выдает ошибку, в которой говорится, что «Ошибка UnicodeDecodeError: кодек utf-8 не может декодировать байт 0x99 в позиции 1819: недопустимый начальный байт«. но тот же код работает в Windows без ошибок.так как я не знаю о типе кодировки исходного файла, я передаю тип кодировки как Нет. И это также хорошо работает в Windows, но когда мы запускаем код в Linux, он выдает ошибку, в которой говорится, что «тип кодировки None не распознается«. я использую библиотеку кодеков для чтения файла, и версия python, которую я использую, составляет 3.7.3
with codecs.open("recode.dat",encoding=None,errors='replace') as open_src:
with open("target_file.dat", 'w ',encoding=None) as open_tgt:
for src_rec in open_src:
new_rec = ''
for f_length in data_type_length:
f_length = int(f_length)
field = '"' src_rec[:f_length].strip() '"|'
new_rec = (field)
src_rec = src_rec[f_length:]
open_tgt.write(new_rec[:-1] 'n')
Комментарии:
1. В ASCII все байты меньше 0x80. Все остальное закодировано.
2. @stark только данные внутри файла, и я не уверен, что это тип кодирования. Вот почему я передаю тип кодировки как Нет. я хочу получить файл таким, какой он есть.
3. Кодек преобразует внешнюю форму в строку юникода python. Значение по умолчанию-utf-8. Windows может использовать что-то вроде cp1252 в зависимости от локали, в которой были записаны данные. Видишь docs.python.org/3/library/codecs.html для описания встроенных кодеков.
4. @старк, большое тебе спасибо. но в приведенном выше ответе вы упомянули, что ASCII имеет все байты меньше 0x80. Что ты имеешь в виду?. не могли бы вы объяснить немного подробнее
5. Большинство западных кодировок используют набор символов ASCII для значений в диапазоне от 0x20 до 0x7e. Это печатаемые символы ASCII, найденные в «текстовых» файлах. Если файл содержит значения, выходящие за пределы этого диапазона, он не является обычным текстом и должен быть декодирован тем же кодеком, который использовался для его создания. В противном случае байты будут отображаться на неправильные символы. 0x99 сопоставляется с символом «товарный знак» в CP1252.