【问题标题】:Python: Opening a unicode named xls file from the scriptPython:从脚本中打开一个名为 xls 的 unicode 文件
【发布时间】:2011-07-28 05:01:20
【问题描述】:

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

【问题讨论】:

    标签: python windows unicode subprocess os.system


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 您对这个主题的了解令人印象深刻。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 1970-01-01
      • 2021-01-03
      • 2021-06-22
      • 2011-11-23
      • 2016-01-31
      • 2013-01-04
      • 1970-01-01
      • 2017-04-17
      相关资源
      最近更新 更多