如何在Python中逐个字符读取UTF文件。

3
我有一个UTF-8文件,想要将一些2字节的字符替换为一些HTML标签。
我想用Python脚本实现。只需逐个字符读取文件,并进行一些if操作等等即可。
我的问题是,如果逐个字符读取,那么我只会读取一个字节,但有些字符却是1个字节,有些则是2个字节长。
如何解决这个问题?
我基本上需要的功能是能够逐个字符读取,但它会知道这个字符是1个字节还是2个字节的大小。

1
发布你已经编写的代码将会很有帮助,同时指出你正在使用的Python版本。 - Paulo Bu
“char”指的是一个代码点吗?在UTF-8中,它们可以达到6个字节。 - Kos
请至少发布您的文件内容示例以及您希望如何读取它们。 - shshank
1个回答

5
您需要在指定正确的编码方式下打开文件。在Python 3中,可以使用以下代码实现:
with open("myfile.txt", "r", encoding="utf-8-sig") as myfile:
    contents = myfile.read()
    for char in contents:
        # do something with character

在Python 2中,你可以使用codecs模块
import codecs
with codecs.open("myfile.txt", "r", encoding="utf-8-sig") as myfile:
    contents = myfile.read()
    for char in contents:
        # do something with character

请注意,在这种情况下,Python 2 不会自动进行换行符转换,因此您需要显式地处理 \r\n 的行尾。作为替代方案(Python 2),您可以正常打开文件,然后进行解码;这将使行尾规范化为 \n。
with open("myfile.txt", "r") as myfile:
    contents = myfile.read().decode("utf-8-sig")
    for char in contents:
        # do something with character

请注意,在这两种情况下,您将在Python 2中得到Unicode对象,而不是字符串(在Python 3中,所有字符串都是Unicode对象)。

在Python 3中,我认为UTF-8是默认的文件读取模式,这使得不必要指定它(但如果有明确意图的话,也不错)。更新:根据下面的评论,这是错误的。 - Ivan X
打印每个字符的代码:print char, ord(char)。 - WebOrCode
1
@IvanX: UTF-8 是默认的 源代码 编码。open() 使用的默认编码取决于操作系统。例如,在 Windows 上,它是 cp1252。 - Tim Pietzcker
@TimPietzcker 哦,这很有道理。谢谢你澄清。我只在Linux上进行了快速测试,所以才会得出那个假设。 - Ivan X
@WebOrCode:通常情况下,Python 在打开文本文件时会将所有行结束符转换为单个 \n (在写入文本文件时会将其转换回系统标准的换行符)。 codecs.open() 不会更改操作系统使用的换行格式。 - Tim Pietzcker
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接