Чтение файла с помощью python неправильно работает в Linux

#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.