Python:从脚本中打开带有Unicode名称的xls文件

3 投票
2 回答
1294 浏览
提问于 2025-04-16 14:56

如何在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 个回答

6

可以使用 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功能。不过在这种情况下,你可能根本不需要使用命令行。

4

你应该使用 os.startfile(),而不是 os.system()。你可能还想用 sys.getfilesystemencoding(),比如:

import os
import sys
os.startfile(filename.encode(sys.getfilesystemencoding()))

撰写回答