程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2019-12-24 04:19     阅读(1632)     评论(0)     点赞(27)     收藏(0)


我在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运行时接口使用系统代码页来编码文件名。与OS X和现代Linux版本不同,在Windows上,系统代码页绝不会是UTF-8。因此,UTF-8字节字符串将毫无用处。

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

但是,虽然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'))

可能您想在这里说'cp949'(因为Windows韩语代码页与EUC-KR略有不同)。或者,更一般而言,,'mbcs'它会为您提供系统代码页,该页面可能与您的控制台键入的页面相同。无论如何,我对PyShell并不了解,但是通常情况下,如果上述方法有效,那么您应该可以直接输入:

open(u'한글')


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/182967/ed73a1bf093933a3bb18/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)