Python:从脚本中打开带有Unicode名称的xls文件
如何在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] 系统找不到指定的文件
2 个回答
可以使用 os.startfile()
,正如Bradley提到的那样(赞一个),但要确保传入的是Unicode字符串,而不是字节字符串。
在Windows NT系统中,文件名本身就是Unicode格式的,而在Windows上的Python(与其他大多数脚本语言不同)特别支持将Unicode字符串传递给需要文件名的API:
os.startfile(u'Hello \u05e2\u05d5\u05dc\u05dd.xls') # u'Hello עולם.xls'
如果你传入的是字节字符串,它会被送到标准的C stdio
库。在微软的C运行时中,字节字符串会根据机器的默认字符集(也就是ANSI代码页)转换成Unicode文件名,这就是 getfilesystemencoding()
返回的内容。如果文件名中的每个字符都能在ANSI代码页中表示,那这样做是没问题的,但如果文件名包含其他字符,比如在希伯来语的Windows安装中,就会出错。
不幸的是,system()
或 subprocess
并不支持相同的Unicode功能。不过在这种情况下,你可能根本不需要使用命令行。
你应该使用 os.startfile()
,而不是 os.system()
。你可能还想用 sys.getfilesystemencoding()
,比如:
import os
import sys
os.startfile(filename.encode(sys.getfilesystemencoding()))