Задать вопрос
@immelnikoff
Изучаю БД

Как можно readlin()-ом построчно читать текстовый файл, игнорирую управляющую последовательность \x?

Как в Python 3.7 считывать текстовый файл построчно без интерпретации некоторых/всех управляющих последовательностей символов?
Читаю файл построчно так:
fin = open(...)
for i in range(100):
    mystr = fin.readline()
    ...

Но когда доходит до строки, в которой содержится "...\x98...", то программа выпадает с ошибкой "байт 0x98 не может быть декодирован, так как данный байт не определен в кодировке cp1251". Возникает вопрос, как при чтении можно игнорировать управляющую последовательность \x?
  • Вопрос задан
  • 279 просмотров
Подписаться 1 Средний 9 комментариев
Пригласить эксперта
Ответы на вопрос 4
@Andy_U
Вот тот вариант, который не ломается.

if __name__ == '__main__':

    with open('1933.log', errors='backslashreplace') as f:
        for s in f:
            print('"'+s[:-1]+'"')
Ответ написан
Комментировать
NeiroNx
@NeiroNx
Программист
может надо открыть в бинарном режиме файл?
... = open( ... , "rb")
Ответ написан
@bbkmzzzz
вариант 1: открываете в бинарном режиме, читаете построчно, удаляете ненужные символы, декодируете в нужной кодировке
вариант 2: открываете файл с указание кодировки, скорее всего utf-8
fin = open(..., encoding='utf-8')
\x - управляющий символ для определения байта в шестнадцатеричном виде
Ответ написан
Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах
Ваш случай - смешанный тип файла, текстово-бинарный. Его надо читать как бинарный, обрабатывать данные можно тоже в бинарном режиме. Если нужно, на завершающих этапах обработки можно необходимые данные попытаться преобразовать в текст (в блоке try-catch).
import re

reg = re.compile(rb'([0-9]*)\>([0-9]{4}\-[0-9]{2}\-[0-9]{2}\ [0-9]{2}\:[0-9]{2}\:[0-9]{2}\ \+[0-9]{4})\ (.*)')
with open('1933.log', 'rb') as f:
    for s in f:
        s = s.strip(b'\r\n')
        l = re.split(reg, s)
        chunks = [e for e in l if e]  # не силён в регулярках, в массиве почему-то оказываются пустые строки
        if len(chunks) != 3:
            continue
        code, datetime, payload = chunks
        print(code, datetime, payload)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы