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

发布于 2024-10-29 05:28:38 字数 777 浏览 1 评论 0原文

如何从 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北音执念 2024-11-05 05:28:39

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

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

You should be using os.startfile(), not os.system(). You probably also want to use sys.getfilesystemencoding() e.g.

import os
import sys
os.startfile(filename.encode(sys.getfilesystemencoding()))
冧九 2024-11-05 05:28:38

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 < 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:

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

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 what getfilesystemencoding() 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() or subprocess. But you probably don't need to use the command line in this case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文