【问题标题】:python codec readline fail when unicode mixed with binary当 unicode 与二进制混合时,python 编解码器 readline 失败
【发布时间】:2016-01-22 01:46:27
【问题描述】:

[python 3.4] 有一个 UTF-8 文件混合了日文和二进制文件。 我尝试使用以下代码读取行:

line = None
linecount = 0
with codecs.open(destfile, 'r', 'utf-8') as fd:
    while True:
        try:
            line = fd.readline()
            linecount += 1
        except UnicodeDecodeError:
            continue

        if not line:
            break;

    print(linecount)

尝试忽略带有二进制代码的行,但它会在带有二进制代码的行处停止。

如何正确读取文件而忽略二进制代码行

【问题讨论】:

标签: python unicode utf-8 readline python-unicode


【解决方案1】:

readline 读取更大的块、解码和缓冲区。如果您遇到无效的 utf-8 字符,您将在该无效块中丢失多行。为了让事情变得复杂,即使您认为某些数据是二进制的,它也可能看起来像有效的 utf-8 并且解码没有错误。此外,实际上并不存在“二进制行”这样的东西,因为行只是由0A 字节或0D0A 序列分隔的字节序列。但它们都是二进制数,所以谁说它们是为了终止一行而不是仅仅作为二进制数据的一部分。

考虑到这一点,您可以在换行符上进行解码后进一步解码:

line = None
linecount = 0

for line in open(destfile, 'rb'):
    try:
        line = line.decode('utf-8')
        linecount += 1
    except UnicodeDecodeError:
        pass
print(linecount)

【讨论】:

  • 感谢您的快速回答。这里的问题是读取的行数较少。文件中有 1000 行,但只得到了 500 行。它可能是由二进制代码中的EOF引起的。我怎样才能绕过它到达真正的 EOF?
  • 用单个UnicodeDecodeError 丢失多行意味着将读取更少的行。在 1000 行中,有 500 行丢失了,因为它们恰好位于被丢弃的预读块中。没有 EOF 字符,它只是你读到文件末尾的错误,所以没有什么可以绕过的。我很惊讶我的代码没有正确计算行数,它的目的是在拆分行后进行解码,这样额外的就不会被丢弃。
  • @briantmali,发布一个包含所需输出的示例文件。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 2016-10-26
  • 2015-02-04
  • 1970-01-01
  • 2012-07-25
  • 2019-12-19
  • 2012-04-10
  • 1970-01-01
相关资源
最近更新 更多