我在 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-8
或 mbcs
在 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/