如何在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'
我想在给定的文件路径中间插入一个目录名,像这样:
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'