【问题标题】:How to read large file with unicode in Python 3如何在 Python 3 中使用 unicode 读取大文件
【发布时间】:2012-02-01 04:44:31
【问题描述】:

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

文件“addRNC.py”,第 47 行,在 add_rnc()

文件“addRNC.py”,第 13 行,在 init 中 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()

【问题讨论】:

  • 是什么让您认为该文件是一个以 UTF-8 编码的 Unicode 文件?例如,字节 0xD3 是 MacRoman 编码中的 U+201D ʀɪɢʜᴛ ᴅᴏᴜʙʟᴇ Qᴜᴏᴛᴀᴛɪᴏɴ ᴍᴀʀᴋ。该文件是否验证为 UTF-8?

标签: python unicode python-3.x


【解决方案1】:

您的文件实际上包含无效的 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。

【讨论】:

  • 我认为是 Unicode 字符,因为在 158 位有一个 'Ó'。
  • @hidura:Unicode 和 UTF-8 不是一回事。是的,您的文件包含 Unicode 字符。 not 意味着它是以 UTF-8 编码的。 HTTP://regebro.wordpress.com/2011/03/23/… 158 位根本没有字符,有一个 NUMBER。这个数字是 201。在 UTF-8 中,这是一个 Ó,正确。在 MacRoman 中,它是一个引号。 Ó有意义吗? 157和159位是什么?
  • @hidura 并非所有非英文字符都是 Unicode。许多遗留文档使用所谓的 codepages (en.wikipedia.org/wiki/Code_page)。
  • @Borealid:其中包含的字符都是 Unicode 的一部分,因此是 Unicode 字符。 :-)
  • @LennartRegebro 不完全正确; Unicode 在某些情况下将多个先前不同的字形合并为单个字符,在某些情况下则相反。请参阅en.wikipedia.org/wiki/Code_page_437 表格下方的注释;代码页中的字符与预期的视觉表示相关联,而不是语义!
猜你喜欢
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2023-03-20
相关资源
最近更新 更多