文件读取如何以utf-8编码工作?

时间:2012-06-26 14:01:19

标签: python utf-8 io

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

我的问题是:当使用utf-8等其他编码时,这是否也能正常工作?我知道utf-8,例如,某些字符需要几个字节。

似乎如果这些方法在解析utf-8文件时仍处理字节,则可能会导致意外行为(例如,游标可能最终出现在字符的多字节编码或多字节字符中)可以注册为几个字符)。

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

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

  

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

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

2 个答案:

答案 0 :(得分:2)

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

  

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

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

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

答案 1 :(得分:1)

使用utf-8编码进行的一些实验(在具有大量多字节字符的文件中重复搜索和打印.read(1)方法)显示,是的,.seek()和.read()的行为方式不同utf-8文件......它们不处理单个字节,而是处理单个字符。这包括几个简单的代码重写,阅读和寻求不同的模式。

感谢@satuon的帮助。

相关问题