如何在Python 3中使用unicode读取大文件

hid*_*ura 1 python unicode python-3.x

您好我有一个包含unicode字符的大文件,当我尝试在Python 3中打开它时,这就是我的错误.

在add_rnc()中输入第47行"addRNC.py"

文件"addRNC.py",线路13,在初始化 用于rawDoc.readline()值:

文件"/usr/local/lib/python3.1/codecs.py",第300行,解码(结果,消耗)= self._buffer_decode(data,self.errors,final)

UnicodeDecodeError:'utf8'编解码器无法解码158位的字节0xd3:无效的连续字节

我尝试了一切,但没有工作,这里是代码:

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()
Run Code Online (Sandbox Code Playgroud)

Bor*_*lid 5

您的文件实际上包含无效的UTF-8.

当您说"包含unicode字符"时,您应该知道Unicode没有指定字符的表示方式.因此,即使文件代表Unicode数据,它也可以是UTF-8,UTF-16(UTF-16BE或UTF-16LE,每个都有或没有BOM),不推荐使用的UCS-2,或者甚至是其中一个深奥的形式......

仔细检查文件是否有效; 我敢打赌你确实有一个字节0xD3(11010011),它必须在UTF-8中是一个双字节字符的前导字节,在一个跟随位置(换句话说,0xD3紧跟在一个二进制表示开始的字节之后) 11 [大于0xC0]).

最可能的原因是您的文件包含非ASCII字符,但不是UTF-8.