为什么列表上的 os.path.join() 和列表上的 os.path.sep.join() 在功能上不相同?

Why are os.path.join() on a list and os.path.sep.join() on a list not functionally identical?

我正在开发一个需要拆分和重新加入一些文件路径的程序,我不确定为什么 os.path.join(*list) 和 os.path.sep.join(list) 会产生不同的结果当分隔路径中存在驱动器号时。

import os

path = 'C:\Users\choglan\Desktop'

separatedPath = path.split(os.path.sep)
# ['C:', 'Users', 'choglan', 'Desktop']

path = os.path.sep.join(separatedPath)
# C:\Users\choglan\Desktop
print(path)

path = os.path.join(*separatedPath)
# C:Users\choglan\Desktop
print(path)

为什么会这样?即使 os.path.join(*list) 似乎更常用,我是否应该只对我的程序使用 os.path.sep.join(list)?

os.path.join 并不是 path.split(os.path.sep) 的倒数。如果您阅读 docs,您会发现一个过程的描述比仅仅在参数之间插入 os.path.sep 要复杂得多。最相关的部分如下:

On Windows... Note that since there is a current directory for each drive, os.path.join("c:", "foo") represents a path relative to the current directory on drive C: (c:foo), not c:\foo.

您可能应该使用 pathlib.PurePath(path).parts 而不是 path.split(os.path.sep)

os.path.sep 不是一个有自己方法的独立对象,它是一个字符串。所以它的 join 方法只是将字符串与它们之间的那个字符粘贴在一起。

>>> type(os.path.sep)
<class 'str'>

您可以使用任何字符串中的 join

>>> '|'.join(separatedPath)
'C:|Users|choglan|Desktop'