python 为什么Windows上的一些操作系统函数会忽略尾随空格?

2ekbmq32  于 2022-12-28  发布在  Python
关注(0)|答案(1)|浏览(146)

我已经在Windows和Linux上使用Python 3.11.0尝试了下面的示例程序。

import os

if __name__ == "__main__":
    directory_name = "foo "
    file_name = "bar.txt"
    os.mkdir(directory_name)
    print(os.path.exists(directory_name))
    out_path = os.path.join(directory_name, file_name)
    try:
        with open(out_path, "w") as bar_file:
            pass
        print(f"Successfully opened {repr(out_path)}.")
    except FileNotFoundError:
        print(f"Could not open {repr(out_path)}.")
    print(os.listdir())

Linux上的输出是我所期望的:

True
Successfully opened 'foo /bar.txt'.
['foo ']

但是,在Windows上,我得到了下面的输出。

True
Could not open 'foo \\bar.txt'.
['foo']

看起来os.mkdiros.path.exists忽略了目录名中的尾随空格,但os.path.join没有。
为什么这些方法在Windows上会有这样的行为?这种行为是故意的吗?此外,克服这种差异并在两个系统上获得相同行为的最佳方法是什么?

nxowjjhe

nxowjjhe1#

在Windows上,通常允许使用尾随空格,但在某些上下文中可能会自动删除尾随空格。
观察到的行为可能是由于这些函数在操作系统中的底层实现所致。os.mkdir函数和os.path.exists函数可能正在使用Windows API函数CreateDirectory,而ignores trailing spaces(参见该超链接中的备注)。另一方面,os.path.join函数可能使用字符串操作来连接目录名和文件名,这不会自动删除尾随空格。您可以考虑浏览os source code以确定后面的部分。
为了在Windows和Linux上获得一致的行为,您可以在这些函数中使用目录名之前,从目录名中删除任何尾随空格。(例如使用rstrip):
directory_name = directory_name.rstrip()

相关问题