python - 在 python 中使用编解码器 utf-8 文件打开错误

标签 python unicode utf-8

我在 windows xp 和 python 2.6.4 上执行以下代码

但它显示 IOError。

如何打开名称为 utf-8 编解码器的文件。

>>> open( unicode('한글.txt', 'euc-kr').encode('utf-8') )

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    open( unicode('한글.txt', 'euc-kr').encode('utf-8') )
IOError: [Errno 22] invalid mode ('r') or filename: '\xed\x95\x9c\xea\xb8\x80.txt'

但是下面的代码能够正常运行。

>>> open( unicode('한글.txt', 'euc-kr') )
<open file u'\ud55c\uae00.txt', mode 'r' at 0x01DD63E0>

最佳答案

Windows 向 Python 公开的 C 运行时接口(interface)使用系统代码页对文件名进行编码。与 OS X 和现代 Linux 版本不同,在 Windows 上,系统代码页从不是 UTF-8。所以 UTF-8 字节字符串不会有任何好处。

您可以使用 .encode('mbcs') 将文件名编码为当前代码页,在您的情况下,这可能等同于 .encode('cp949')。为了使其与文件名为 UTF-8 的其他平台兼容,您可以查找 sys.getfilesystemencoding,它将为您提供 utf-8mbcs 在 Windows 上。

然而,虽然 cp949 适用于韩语字符,但它会破坏该代码页(EUC-KR 的扩展版本)的全部内容之外的任何内容。

所以另一种方法是将文件名保留为 Unicode。在 Windows 上,这将使用 Unicode-native 接口(interface)以内部使用的 UTF-16LE 编码将文件名传递给 Windows。 (有关此功能的更多信息,请参阅 PEP277。)

这通常也适用于其他平台:Linux 和 OS X 应该默默地为您将 Unicode 文件名编码为 UTF-8。这在旧的 Python 版本中可能会失败更多,但它是 Python 3 中处理文件名的默认方式(默认字符串类型已更改为 Unicode)。

在 Python 2 上使用 Unicode 文件名时要注意的陷阱是:

  • 如果 os.path.supports_unicode_filenames为 False,因为它将在 Windows 之外,返回文件名的函数(例如 os.listdir)将始终为您提供字节字符串。您必须使用 sys.getfilesystemencoding 检测并解码它们。

  • 如果您在 Linux/OS X 上有一个名称不是有效 UTF-8 字符串的文件,您将无法为其获取 Unicode 文件名(如果您尝试,会出现 UnicodeDecodeError)。有点极端情况,但它会导致恼人的无法访问文件。

顺便说一下,

open(unicode('한글.txt', 'euc-kr'))

您可能想在那里说 'cp949'(因为 Windows 韩文代码页与 EUC-KR 有细微差别)。或者,更一般地说,'mbcs',它为您提供系统代码页,它可能与您的控制台输入的代码页相同。无论如何,我不知道 PyShell,但通常情况下,如果上面的方法有效,那么你应该可以直接输入它:

open(u'한글')

关于python - 在 python 中使用编解码器 utf-8 文件打开错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1737410/

相关文章:

python - 将列表复制到 numpy 数组的一部分

python - 填充 groupby 对象序列,Pandas

c++ - 您如何编写对 UTF-8 安全的代码?

python - 安全地从 python 中的字符串中删除所有 html 代码

python - 使用 Python 在 Selenium 中第二次出现元素后获取 td 的文本

python - 有没有办法根据某些 bool 值在逻辑运算符之间进行交换?

ubuntu - NSIS (Ubuntu) 的 Unicode 支持

windows - Windows上Haskell中的Unicode控制台I/O

Python - 使用 BOM 解码 UTF-16 文件

php - 将utf-8字符串插入数据库然后输出到网页的问题