如何在Python中的文件路径中间插入一个目录?

How to insert a directory in the middle of a file path in Python?

我想在给定的文件路径中间插入一个目录名,像这样:

directory_name = 'new_dir'
file_path0 = 'dir1/dir2/dir3/dir4/file.txt'
file_path1 = some_func(file_path0, directory_name, position=2)
print(file_path1)
>>> 'dir1/dir2/new_dir/dir3/dir4/file.txt'

我查看了 os.path 和 pathlib 包,但看起来它们没有允许在文件路径中间插入的功能。我试过了:

import sys,os
from os.path import join

path_ = file_path0.split(os.sep)
path_.insert(2, 'new_dir')
print(join(path_))

但这会导致错误

"expected str, bytes or os.PathLike object, not list"

有谁知道允许在文件路径中间插入的标准 python 函数?或者 - 我怎样才能把 path_ 变成可以被 os.path 处理的东西。我是 pathlib 的新手,所以也许我错过了一些东西


编辑:根据问题的答案,我可以提出以下解决方案:

1.) 正如 Zach Favakeh 建议和 this answer 中所写,只需使用 'splat' 运算符 * 将我上面的代码更正为 join(*path_) 即可解决所有问题.

2.) 正如 buran 所建议的,您可以使用 pathlib 包,简而言之,它会导致:

from pathlib import PurePath

path_list = list(PurePath(file_path0).parts)
path_list.insert(2, 'new_dir')
file_path1 = PurePath('').joinpath(*path_list)

print(file_path1)
>>> 'dir1/dir2/new_dir/dir3/dir4/file.txt'

因为你想在列表上使用连接来生成路径名,你应该使用 "splat" 运算符执行以下操作:Python os.path.join() on a list

编辑:您还可以获取 np 数组并使用 np.array2string 将其元素连接成一个字符串,使用“/”作为分隔符参数:https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.array2string.html

希望对您有所帮助。

我试了一下你的需求:

directory_name = '/new_dir'

file_path0 = 'dir1/dir2/dir3/dir4/file.txt'

before_the_newpath = 'dir1/dir2'

position = file_path0.split(before_the_newpath)

new_directory = before_the_newpath + directory_name + position[1]

希望对您有所帮助。

看看pathlib.PurePath.parts。它将return 分离路径的组成部分,您可以在所需位置插入并构建新路径

>>> from pathlib import PurePath
>>> file_path0 = 'dir1/dir2/dir3/dir4/file.txt'
>>> p = PurePath(file_path0)
>>> p.parts
('dir1', 'dir2', 'dir3', 'dir4', 'file.txt')
>>> spam = list(p.parts)
>>> spam.insert(2, 'new_dir')
>>> new_path = PurePath('').joinpath(*spam)
>>> new_path
PurePosixPath('dir1/dir2/new_dir/dir3/dir4/file.txt')

这将适用于作为 str 的路径以及 pathlib.Path 对象

使用正则表达式的解决方案。正则表达式将创建以下组

[^\/]+   - non-'/' characters(i.e. directory names)
\w+\.\w+ - word characters then '.' then word characters (i.e. file name)
import re

directory_name = 'new_dir'
file_path0 = 'dir1/dir2/dir3/dir4/file.txt'
position = 2

regex = re.compile(r'([^\/]+|\w+\.\w+)')
tokens = re.findall(regex, file_path0)
tokens.insert(position, directory_name)
file_path1 = '/'.join(tokens)

结果:

'dir1/dir2/new_dir/dir3/dir4/file.txt'

您的解决方案只有一个缺陷。在路径列表中插入新目录后 path_.insert(2, 'new_dir') 你需要调用 os.path.join(*path_) 来获取新修改的路径。您得到的错误是因为您将 list 作为参数传递给 join 函数,但您必须解压缩它。

就我而言,我知道插入点之前的路径部分(即“根”)。然而,由于根路径中可能有不同数量的路径组件,因此插入点的位置不是恒定的。我使用 Path.relative_to() 断开完整路径以生成 new_dir.

的插入点
from pathlib import Path

directory_name = Path('new_dir')
root = Path('dir1/dir2/')
file_path0 = Path('dir1/dir2/dir3/dir4/file.txt')

# non-root component of path
chld = file_path0.relative_to(root)
file_path1 = root / directory_name / chld
print(file_path1)

结果:
'dir1/dir2/new_dir/dir3/dir4/file.txt'