Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中逐字符读取UTF文件_Python_Python 2.7_Utf - Fatal编程技术网

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

如何在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

我有一个UTF-8文件,我想用一些HTML标记替换一些2字节的字符

我想为此制作Python脚本。只需读取文件,逐字符读取,并放入一些if等

我的问题是,若我一个字符一个字符地读,我读的是一个字节,但有些字符是1字节,有些是2字节长

如何解决


我基本上需要一个字符一个字符读取的功能,但它会知道这个字符大小是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