3

如何从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] 系统找不到指定的文件

4

2 回答 2

6

os.startfile()正如 Bradley (+1) 所述,但请确保传入 Unicode 字符串,而不是字节字符串。

Windows NT 文件名本身就是 Unicode,Windows 上的 Python(与大多数其他脚本语言不同)内置特定支持,用于将 Unicode 字符串传递到需要文件名的 API:

os.startfile(u'Hello \u05e2\u05d5\u05dc\u05dd.xls')  # u'Hello עולם.xls'

如果您传入一个字节字符串,它将转到标准 Cstdio库,在 Microsoft C 运行时将使用机器的默认字符集(也称为 ANSI 代码页)将字节字符串映射到 Unicode 文件名,这就是getfilesystemencoding()返回的内容。如果文件名中的每个字符都可以在 ANSI 代码页中表示,这仍然有效,但示例文件名将失败,除了 Windows 的希伯来语安装。

不幸的是,相同的 Unicode 支持不适用于system()subprocess。但在这种情况下,您可能不需要使用命令行。

于 2011-04-02T11:50:43.227 回答
4

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

import os
import sys
os.startfile(filename.encode(sys.getfilesystemencoding()))
于 2011-04-02T10:15:50.620 回答