【问题标题】:How to read UTF file char by char in Python [closed]如何在 Python 中逐字符读取 UTF 文件 [关闭]
【发布时间】:2014-07-06 01:59:34
【问题描述】:

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

我想为此编写 Python 脚本。只需逐个字符地读取文件,然后输入一些 if 等等。

我遇到的问题是,如果我逐个字符地读取字符,我正在读取一个字节,但有些字符是 1 个字节,有些是 2 个字节长。

如何解决?

我基本上需要能够逐个字符读取字符的功能,但它会知道这个字符大小是 1 字节还是 2 字节。

【问题讨论】:

  • 贴出你目前写的代码会很有帮助,同时指出你使用的python版本。
  • “char”是指代码点吗?它们在 UTF-8 中最多可达 6 个字节
  • 请至少发布您的文件内容示例以及您希望如何阅读它。

标签: python python-2.7 utf


【解决方案1】:

您需要在指定正确的编码时打开文件。在 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 module:

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 是默认的文件读取模式,因此没有必要指定(但也不是一个坏主意,如果这是明确的意图)。更新:这是错误的,根据下面的评论。
  • 用于打印每个字符:print char, ord( char ).
  • 你能解释一下“所以你需要明确处理 \r\n 行尾”是什么意思吗?这是否意味着所有新行都丢失了?如果有,如何保存?
  • @IvanX:UTF-8 是默认的源代码编码。 open() 使用的默认编码取决于操作系统。例如,在 Windows 上,它是 cp1252。
  • @TimPietzcker 啊,这很有道理。感谢您的澄清。我只是在 Linux 上进行快速测试,这就是我得出这个假设的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 2012-05-27
  • 2011-06-16
相关资源
最近更新 更多