Python 文件读取如何在utf-8编码中工作?

Python 文件读取如何在utf-8编码中工作?,python,utf-8,io,Python,Utf 8,Io,对于输入文本文件,我知道.seek和.tell都使用字节进行操作,通常-也就是说,.seek查找与其给定参数指定的点相关的一定数量的字节,而.tell返回自文件开始以来的字节数 我的问题是:当使用其他编码(如utf-8)时,这是否也会以同样的方式工作?例如,我知道utf-8对某些字符需要几个字节 看起来,如果这些方法在解析utf-8文件时仍然处理字节,那么可能会导致意外行为(例如,光标可能会出现在字符的多字节编码中,或者多字节字符可能会注册为多个字符) 如果是,是否有其他方法来完成相同的任务?尤

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

我的问题是:当使用其他编码(如utf-8)时,这是否也会以同样的方式工作?例如,我知道utf-8对某些字符需要几个字节

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

如果是,是否有其他方法来完成相同的任务?尤其是当解析文件需要有关光标位置的字符信息时

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

infle=open(文件名,encoding='utf-8')


.seek和.tell的行为是否改变?

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

感谢@satuon的帮助。

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

二进制存储器(如文件)上的文本I/O非常重要 在相同的存储上比二进制I/O慢,因为这意味着 使用字符编解码器将unicode数据转换为二进制数据。这 如果处理大量文本数据(例如 示例(非常大的日志文件)。还有,TextIOWrapper.tell()和 TextIOWrapper.seek()由于重建,两者都非常慢 使用的算法

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


来源:

问得好。为什么不测试一下呢?用2-3个汉字保存一个文本文件(使用谷歌翻译获得这些汉字),然后创建一个程序打开它,进行搜索(1),然后从那里打印,看看会发生什么。谢谢!我一直在测试一个utf-8格式的文件,该文件几乎只填充了一个字节字符-我没有想到专门为此制作一个。“我正在使用Python 2.7.3。”-不,你不是因为在Python 2.7 open()中)没有
encoding
关键字参数。我看到其他人使用了encoding关键字,所以我想知道这是否会影响使用infle方法时的工作方式。我起初没有意识到encoding关键字不属于Python 2.7。但是,我会去掉有问题的行以避免混淆。尽管如果您使用的是Python3,
io.open()
只是内置的
open()
的别名。