如何在 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_))

但这会导致错误

"预期的 str、字节或操作系统。路径类对象,而不是列表">

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


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

1.( 正如 Zach Favakeh 所建议的,正如本答案中所写的那样,只需使用"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'

看看 pathlib。它将返回路径的单独组件,您可以在所需位置插入并构造新路径。

>>> 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。路径对象

由于你想在列表上使用join来生成路径名,你应该使用"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

希望这有帮助。

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

[^/]+   - 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'

我根据您的需要进行了尝试:

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]

希望对您有所帮助。

相关内容

  • 没有找到相关文章

最新更新