如何在 Windows 下的 Python 脚本中打开 unicode 命名文件(带空格) ?
文件名例如:Hello עולם.xls
对于非unicode非间隔xls文件,os.system(filename)
效果很好
对于非unicode间隔xls文件,os.system('"'+filename+'"')
效果很好。
但对于unicode空间xls文件......
os.system(filename)
和subprocess.call(new_filename)
都给出了:
UnicodeEncodeError:'ascii'编解码器 不能编码位置的字符 12-13:序数不在范围内(128)
os.system(new_filename.encode('UTF-8'))
给出:
'Hello'未被识别为 内部或外部命令,可操作 程序或批处理文件。
和subprocess.call(new_filename.encode('UTF-8'))
给出:
WindowsError:[错误2]系统找不到指定的文件
答案 0 :(得分:6)
os.startfile()
,但请确保传入Unicode字符串,而不是字节字符串。
Windows NT文件名本身就是Unicode,并且Windows上的Python(与大多数其他脚本语言不同)内置了特定的支持,用于将Unicode字符串传递到期望文件名的API:
os.startfile(u'Hello \u05e2\u05d5\u05dc\u05dd.xls') # u'Hello עולם.xls'
如果你传入一个字节字符串,它将转而使用标准的C stdio
库,它在Microsoft C Runtime上使用机器的默认字符集(又名ANSI代码页)将字节字符串映射到Unicode文件名,这是getfilesystemencoding()
正在返回的内容。如果文件名中的每个字符都可以在ANSI代码页中表示,那么它仍然可以工作,但除了Windows的希伯来语安装之外,示例文件名都会失败。
不幸的是,system()
或subprocess
无法使用相同的Unicode支持。但在这种情况下,您可能不需要使用命令行。
答案 1 :(得分:4)
您应该使用os.startfile()
,而不是os.system()
。您可能还想使用sys.getfilesystemencoding()
例如
import os
import sys
os.startfile(filename.encode(sys.getfilesystemencoding()))