从 Python 中的路径中删除第一个文件夹

从路径中删除第一个文件夹:

  1. 使用 pathlib.Path 类创建路径对象。
  2. 使用 relative_to() 方法删除第一个文件夹。
from pathlib import Path

absolute_path = '/Users/zadmei/workspace/python/main.py'
a_path = Path(absolute_path)


result = a_path.relative_to(*a_path.parts[:2])
print(result)  # ?️ jiyik/workspace/python/main.py

pathlib.Path 类用于根据您的操作系统创建 PosixPath 或 WindowsPath 对象。

PurePath.relative_to() 方法返回到由提供的参数标识的另一个路径的相对路径。

from pathlib import Path

absolute_path = '/Users/zadmei/workspace/python/main.py'
a_path = Path(absolute_path)

# ?️ zadmei/workspace/python/main.py
print(str(a_path.relative_to('/home')))

PurePath.parts 属性返回一个包含路径组件的元组。

from pathlib import Path

absolute_path = '/Users/zadmei/workspace/python/main.py'
a_path = Path(absolute_path)


# ?️ ('/', 'Users', 'zadmei', 'workspace', 'python', 'main.py')
print(a_path.parts)

print(a_path.parts[:2])  # ?️ ('/', 'Users')

要从路径中删除第一个文件夹,我们将路径的前两个组件传递给 relative_to() 方法。

from pathlib import Path

absolute_path = '/Users/zadmei/workspace/python/main.py'
a_path = Path(absolute_path)


result = a_path.relative_to(*a_path.parts[:2])
print(result)  # ?️ zadmei/workspace/python/main.py

切片 my_tuple[:2] 从索引 0 开始并上升到但不包括索引 2。

换句话说,切片返回元组的前两个元素。

* 可迭代解包运算符使我们能够在函数调用、推导式和生成器表达式中解包可迭代对象。

example = (*(1, 2), 3)

# ?️ (1, 2, 3)
print(example)

或者,我们可以在分隔符上拆分路径。


使用 os.path.join() 从路径中删除第一个文件夹

从路径中删除第一个文件夹:

  1. 使用 str.split() 方法在每个分隔符上拆分路径。
  2. 使用列表切片选择从索引 2 开始的列表元素。
  3. 使用 os.path.join() 方法将列表的其余部分连接成一个字符串。
import os

absolute_path = '/Users/zadmei/workspace/python/main.py'

result = os.path.join(*(absolute_path.split(os.path.sep)[2:]))
print(result)  # ?️ zadmei/workspace/python/main.py

os.sep 属性返回操作系统用来分隔路径名组件的字符。

import os

print(os.path.sep)  # ?️ '/'

分隔符对于 POSIX 是 /,对于 Windows 是 \\。

我们使用 str.split() 方法在每次出现分隔符时拆分路径。

import os

absolute_path = '/Users/zadmei/workspace/python/main.py'

# ?️ ['', 'Users', 'zadmei', 'workspace', 'python', 'main.py']
print(absolute_path.split(os.path.sep))

# ?️ ['zadmei', 'workspace', 'python', 'main.py']
print(absolute_path.split(os.path.sep)[2:])

最后一步是在调用 os.path.join() 方法时解压从索引 2 开始的列表项。

import os

absolute_path = '/Users/zadmei/workspace/python/main.py'

result = os.path.join(*(absolute_path.split(os.path.sep)[2:]))
print(result)  # ?️ zadmei/workspace/python/main.py

切片 my_list[2:] 从索引 2 开始,一直到列表的末尾。

os.path.join 方法智能地连接一个或多个路径。

import os

# ?️ /Users/zadmei
print(os.path.join('/', 'Users', 'zadmei'))

如果提供的任何组件是绝对路径,则所有先前的组件都将被丢弃,并从绝对路径开始继续连接。