Python:从脚本中打开名为xls文件的unicode

时间:2011-04-02 10:09:46

标签: python windows unicode subprocess os.system

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

答案 0 :(得分:6)

Bradley(+1)提到的

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()))