我已经在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.mkdir
和os.path.exists
忽略了目录名中的尾随空格,但os.path.join
没有。
为什么这些方法在Windows上会有这样的行为?这种行为是故意的吗?此外,克服这种差异并在两个系统上获得相同行为的最佳方法是什么?
1条答案
按热度按时间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()