阅读python 3中的香港补充字符集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阅读python 3中的香港补充字符集相关的知识,希望对你有一定的参考价值。

我有一个试图在python 3中读取的hkscs数据集。下面的代码

encoding = 'big5hkscs'
lines = []
num_errors = 0
for line in open('file.txt'):
    try:
        lines.append(line.decode(encoding))
    except UnicodeDecodeError as e:
        num_errors += 1

它向我抛出错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0xae in position 0: invalid start byte。似乎数据集中有一个非utf-8字符,代码无法解码。

我尝试在此行中添加errors = ignorelines.append(line.decode(encoding, errors='ignore'))

但是那不能解决问题。

有人可以提出建议吗?

答案

如果文本文件包含使用非默认编码编码的文本,则在打开文件时必须指定编码,以避免解码错误:

encoding = 'big5hkscs'
path = 'file.txt'
with open(path, 'r', encoding=encoding,) as f:
    for line in f:
        # do something with line

或者,文件可以以二进制模式打开,然后在文本解码后进行:

encoding = 'big5hkscs'
path = 'file.txt'
with open(path, 'rb') as f:
    for line in f:
       decoded = line.decode(encoding)
       # do something with decoded text

在此问题中,文件在打开时未指定编码,因此其内容将自动使用默认编码进行解码-在这种情况下,显然是UTF-8。

另一答案

看起来好像我不添加except子句except UnicodeDecodeError as e,效果很好

encoding = 'big5hkscs'
lines = []
path = 'file.txt'
with open(path, encoding=encoding, errors='ignore') as f:
    for line in f:
        line = '\t' + line
        lines.append(line)
另一答案

snakecharmerb的答案是正确的,但可能需要解释。

您不是在原始问题中写的,但我认为您在for行上有错误。在这一行中,您正在从UTF-8解码文件(可能是您环境中的默认文件,而不是Windows上的默认文件),但是稍后您尝试再次对其进行解码。因此错误不是关于解码big5hkscs,而是关于将文件作为文本打开。

就像snakecharmerb的正确答案(第二部分)一样,您应该将文件打开为二进制文件,这样就无需解码文本,然后可以使用line.decode(encoding)解码文本。注意:我不确定您是否可以读取二进制文件上的lines。这样,您仍然可以捕获错误,例如写一条消息。否则,通常的方法是在open()时解码,但是这样一来,您就失去了后退功能并获得更好的错误消息(例如行号)的能力。

以上是关于阅读python 3中的香港补充字符集的主要内容,如果未能解决你的问题,请参考以下文章

补充:第9天python的学习

3.(补充)python中的lambda表达式的基本使用

Python补充05 字符串格式化 (%操作符)

day13.复习补充

Python:补零操作,补充字符串,格式化输出

day2—Python基本知识的补充:对象的方法