【问题标题】:How does file reading work in utf-8 encoding?文件读取如何在 utf-8 编码中工作?
【发布时间】:2012-06-26 14:01:19
【问题描述】:

对于输入文本文件,我知道 .seek 和 .tell 通常都使用字节进行操作 - 也就是说,.seek 查找与其给定参数指定的点相关的一定数量的字节,并且 .tell 返回自文件开头以来的字节数。

我的问题是:在使用其他编码(如 utf-8)时,这是否同样有效?例如,我知道 utf-8 需要几个字节来表示某些字符。

如果这些方法在解析 utf-8 文件时仍然处理字节,那么可能会导致意外的行为(例如,光标可能最终位于字符的多字节编码或多字节字符中可以注册为多个字符)。

如果是这样,是否有其他方法可以完成相同的任务?特别是在解析文件时需要有关光标位置的字符信息。

另一方面,如果你在 open() 函数中指定编码...

infile = open(filename, encoding='utf-8')

.seek 和 .tell 的行为会改变吗?

【问题讨论】:

  • 好问题。你为什么不测试一下?保存一个包含 2-3 个中文字符的文本文件(使用谷歌翻译来获取这些字符),然后创建一个程序来打开它,执行 seek(1),然后从那里打印,看看会发生什么。
  • 谢谢!我一直在使用 utf-8 格式的文件进行测试,该文件几乎只填充了一个字节的字符 - 我没想过专门为此目的制作一个。
  • “我使用的是 Python 2.7.3。” - 不,你不是因为在 python 2.7 open() 中没有 encoding 关键字参数。
  • 我看到其他人使用 encoding 关键字,所以我想知道这是否会影响 infile 的方法在使用时的工作方式。起初我没有意识到 encoding 关键字不属于 Python 2.7。但是,我会删除违规行以避免混淆。

标签: python utf-8 io


【解决方案1】:

假设您使用的是io.open()(与内置的open() 不同),那么使用文本模式可以获得io.TextIO 的实例,所以这应该回答您的问题:

二进制存储(例如文件)上的文本 I/O 显着 比相同存储上的二进制 I/O 慢,因为这意味着 使用字符编解码器从 unicode 转换为二进制数据。这个 如果您处理大量文本数据(例如 例如非常大的日志文件)。此外,TextIOWrapper.tell() 和 TextIOWrapper.seek() 都非常 由于重建而缓慢 使用的算法

注意:您还应该知道,这仍然不能保证 seek() 会跳过字符,而是 unicode 代码点(单个字符可以由多个代码点,例如 ą 可以写成 u'\u0105'u'a\u0328' - 两者都将打印相同的字符。

来源:http://docs.python.org/library/io.html#id1

【讨论】:

  • 虽然如果你使用 Python 3,io.open() 只是内置 open() 的别名。
【解决方案2】:

对 utf-8 编码的一些实验(在包含大量多字节字符的文件中重复查找和打印 .read(1) 方法)表明,是的,.seek() 和 .read() 在utf-8 文件...它们不处理单个字节,而是单个字符。这包括几个简单的代码重写,以不同的模式阅读和寻找。

感谢@satuon 的帮助。

【讨论】:

    猜你喜欢
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2016-08-14
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多