如何在Python中逐字符读取UTF文件
我有一个UTF-8文件,我想用一些HTML标记替换一些2字节的字符 我想为此制作Python脚本。只需读取文件,逐字符读取,并放入一些if等 我的问题是,若我一个字符一个字符地读,我读的是一个字节,但有些字符是1字节,有些是2字节长 如何解决如何在Python中逐字符读取UTF文件,python,python-2.7,utf,Python,Python 2.7,Utf,我有一个UTF-8文件,我想用一些HTML标记替换一些2字节的字符 我想为此制作Python脚本。只需读取文件,逐字符读取,并放入一些if等 我的问题是,若我一个字符一个字符地读,我读的是一个字节,但有些字符是1字节,有些是2字节长 如何解决 我基本上需要一个字符一个字符读取的功能,但它会知道这个字符大小是1或2字节。您需要在指定正确编码的同时打开文件。在Python3中,这是使用 with open("myfile.txt", "r", encoding="utf-8-sig") as myf
我基本上需要一个字符一个字符读取的功能,但它会知道这个字符大小是1或2字节。您需要在指定正确编码的同时打开文件。在Python3中,这是使用
with open("myfile.txt", "r", encoding="utf-8-sig") as myfile:
contents = myfile.read()
for char in contents:
# do something with character
在Python 2中,您可以使用:
注意,在这种情况下,Python2不会进行自动换行转换,因此需要显式地处理\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
请注意,在这两种情况下,在Python2中都将使用Unicode对象,而不是字符串(在Python3中,所有字符串都是Unicode对象)。发布您迄今为止编写的代码,并指出您使用的是哪种Python版本会很有帮助。您所说的“char”是指代码点吗?在UTF-8中,它们最多有6个字节。请至少发布文件内容的示例以及您希望如何读取它。在Python 3中,我认为UTF-8是默认的文件读取模式,因此无需指定(但如果这是明确的意图,这也不是一个坏主意)。更新:根据下面的注释,这是错误的。对于打印每个字符:打印字符,ord(字符)。您能详细解释一下“因此您需要明确处理\r\n行结尾”的含义吗。这是否意味着所有新线都丢失了?如果是,如何保存它们?@IvanX:UTF-8是默认的源代码编码。
open()
使用的默认编码依赖于操作系统。例如,在Windows上是cp1252。@TimPietzcker啊,这是有道理的。谢谢你的澄清。我只是在Linux上进行快速测试,这就是我得出这个假设的原因。
with open("myfile.txt", "r") as myfile:
contents = myfile.read().decode("utf-8-sig")
for char in contents:
# do something with character