Ошибка unicodeDecodeError и TypeError при чтение txt файла

Рейтинг: 0Ответов: 1Опубликовано: 22.06.2023

Вот кусок кода, в котором появляется ошибка при запуске:

def logon(logons):
    result_list_logon = {}
    
    with open(logons) as file: 
        lines = file.readlines() 
        length = len(lines) 
        
        for i in range(length):
            each_line = lines[i]
            array_line = each_line.split(' ')
            

В функцию logon передаётся строкой путь к файлу, который затем открывается на чтение и построчно записывается в переменную lines.

Сначала была ошибка:

    File "/home/senior/home/log/script.py", line 121, in <module>
    all()
  File "/home/senior/home/log/script.py", line 102, in all
    logon_res = logon(logons)
  File "/home/senior/home/log/script.py", line 41, in logon
    lines = file.readlines()
  File "/usr/local/lib/python3.10/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x88 in position 1381: invalid start byte

Чтобы ее исправить добавила в функцию, где файл открывается на чтение, вместо 'r' - 'rb' И теперь получается следующая ошибка:

array_line = each_line.split(' ')
TypeError: a bytes-like object is required, not 'str'

Это делается чтобы разбить в переменной каждую строку файла на слова по пробелу и дальше их перебирая и выводить их в нужные переменные

Не могу понять, как сделать чтобы он читался, вроде замкнутый круг получается

Скрипт запускается с Debian 11 Python3.10.11, а файл идут с Windows, думала может проблема в разных файловых системах, но файл корректно открывается в debian через nano/vim

Ответы

▲ 0Принят

Ответ оказался еще проще Нужно было при открытие файла указать, чтобы если символ не подходит под кодировку его либо пропускало/либо заменяло знаками "???"

Работающий вариант:

def logon(logons):
    result_list_logon = {}
    
    with open(logons, encoding='ascii', errors='ignore') as file: 
        lines = file.readlines() 
        length = len(lines) 
        
        for i in range(length):
            each_line = lines[i]
            array_line = each_line.split(' ')