Python:从脚本中打开名为 xls 的 unicode 文件
如何从 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]系统找不到指定的文件
How do you open a unicode named file (with spaces) from within a Python script under Windows?
filename for example: Hello עולם.xls
For a non-unicode non-spaced xls file, os.system(filename)
works well.
For a non-unicode spaced xls file, os.system('"'+filename+'"')
works well.
But for a unicode spaces xls file...
both os.system(filename)
and subprocess.call(new_filename)
give:
UnicodeEncodeError: 'ascii' codec
can't encode characters in position
12-13: ordinal not in range(128)
os.system(new_filename.encode('UTF-8'))
gives:
'Hello' is not recognized as an
internal or external command, operable
program or batch file.
and subprocess.call(new_filename.encode('UTF-8'))
gives:
WindowsError: [Error 2] The system cannot find the file specified
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您应该使用
os.startfile()
,而不是os.system()
。您可能还想使用sys.getfilesystemencoding()
< /a> 例如You should be using
os.startfile()
, notos.system()
. You probably also want to usesys.getfilesystemencoding()
e.g.os.startfile()
正如 Bradley (+1) 所提到的,但请确保传入 Unicode 字符串,而不是字节字符串。Windows NT 文件名本身就是 Unicode,并且 Windows 上的 Python(与大多数其他脚本语言不同)内置了特定支持,用于将 Unicode 字符串传递到需要文件名的 API:
如果您传递字节字符串,它将转为标准 C < code>stdio 库,它在 Microsoft C 运行时将使用机器的默认字符集(也称为 ANSI 代码页)将字节字符串映射到 Unicode 文件名,这就是
getfilesystemencoding()
正在返回。如果文件名中的每个字符都可以在 ANSI 代码页中表示,那么该方法仍然有效,但示例文件名对于除 Windows 的希伯来语安装之外的任何其他文件都会失败。不幸的是,相同的 Unicode 支持不适用于
system()
或subprocess
。但在这种情况下您可能不需要使用命令行。os.startfile()
as mentioned by Bradley (+1), but make sure to pass a Unicode string in, and not a byte string.Windows NT filenames are natively Unicode, and Python on Windows has (unlike most other scripting languages) specific support built in for passing Unicode-strings into APIs that expect filenames:
If you pass in a byte string it will go instead to the standard C
stdio
library, which on the Microsoft C Runtime will map byte strings to Unicode filenames using the machine's default character set (aka ANSI code page), which is whatgetfilesystemencoding()
is returning. That'll still work if every character in the filename is representable in the ANSI code page, but the example filename would fail for anything but a Hebrew installation of Windows.Unfortunately the same Unicode support isn't available for
system()
orsubprocess
. But you probably don't need to use the command line in this case.