我想在给定文件路径的中间插入一个目录名称,如下所示:
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]
希望对您有所帮助。