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

jeo*_*eon 3 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'
Run Code Online (Sandbox Code Playgroud)

但是下面的代码才能正常运行.

>>> open( unicode('??.txt', 'euc-kr') )
<open file u'\ud55c\uae00.txt', mode 'r' at 0x01DD63E0>
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 16

Windows向Python公开的C运行时接口使用系统代码页来编码文件名.与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本机接口以内部使用的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'))
Run Code Online (Sandbox Code Playgroud)

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

open(u'??')
Run Code Online (Sandbox Code Playgroud)