Как читать большой файл с Unicode в Python 3 - PullRequest
1 голос
/ 01 февраля 2012

Здравствуйте, у меня есть большой файл, который содержит символы Юникода, и когда я пытаюсь открыть его в Python 3, у меня возникает ошибка.

Файл "addRNC.py", строка 47,в add_rnc ()

Файл "addRNC.py", строка 13, в init для значения в rawDoc.readline ():

File "/ usr / local /lib / python3.1 / codecs.py ", строка 300, в декодировании (результат, используется) = self._buffer_decode (data, self.errors, final)

UnicodeDecodeError: кодек utf8 не может декодироватьбайт 0xd3 в позиции 158: недопустимое продолжение байта

И я пробую все и не сработало, вот код:

rawDoc = io.open("/root/potential/rnc_lst.txt", 'r', encoding='utf8')
    result = []
    for value in rawDoc.readline():

        if len(value.split('|')[9]) > 0 and len(value.split('|')[10]) > 0: 
            if value.split('|')[9] == 'ACTIVO' and value.split('|')[10] == 'NORMAL':
                address = ''
                for piece in value.split('|')[4:7]:
                    address += piece
                if value.split('|')[8] != '':
                    rawdate = value.split('|')[8].split('/')
                    _date = rawdate[2]+"-"+rawdate[1]+"-"+rawdate[0]
                else:
                    _date = 'NULL'

                id = db.prepare("SELECT id FROM potentials_reg WHERE(rnc = '%s')"%(value.split('|')[0]))()

                if len(id) == 0:
                    if _date == 'NULL':
                        db.prepare("INSERT INTO potentials_reg (rnc, _name, _owner, work_type, address, telephone, constitution, active)"+ 
                                "VALUES('%s', '%s', '%s', '%s', '%s', '%s', NULL, '%s')"%(value.split('|')[0], value.split('|')[1], 
                                                                        value.split('|')[2],value.split('|')[3],address, 
                                                                        value.split('|')[7], 'true'))()
                    else:
                        db.prepare("INSERT INTO potentials_reg (rnc, _name, _owner, work_type, address, telephone, constitution, active)"+ 
                                "VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')"%(value.split('|')[0], value.split('|')[1], 
                                                                        value.split('|')[2],value.split('|')[3],address, 
                                                                        value.split('|')[7],_date, 'true'))()
                else:
                    pass

    db.close()

1 Ответ

5 голосов
/ 01 февраля 2012

Ваш файл на самом деле содержит недействительный UTF-8.

Когда вы говорите «содержит символы Unicode», вы должны знать, что Unicode не определяет, как символы представлены. Так что , даже если файл представляет данные Unicode , это может быть UTF-8, UTF-16 (UTF-16BE или UTF-16LE, каждый с или без спецификации), устаревший UCS-2 или возможно, даже одна из самых эзотерических форм ...

Дважды проверьте, что файл действителен; Могу поспорить, что у вас действительно есть байт 0xD3 (11010011), который в UTF-8 должен быть старшим байтом двухбайтового символа в позиции последователя (другими словами, 0xD3 сразу следует за байтом, двоичное представление которого начинается с 11 [больше 0xC0]).

Наиболее вероятная причина этого в том, что ваш файл содержит не-ASCII символов, но не в UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...