Python 3.6 pathlib路径改名父目录
Python 3.6 pathlib Path change name parent directory
从 Python 3.4 添加的 pathlib library 的新 Path 包似乎是 os.path.join()
等方法的强大替代品,但我在工作时遇到了一些麻烦用它。
我有一条路径,可以是从 folder_foo/file.csv
到 long/path/to/folder_foo/file.csv
的任何路径。我用pandas读取了folder_foo
中的.csv文件,修改后想保存到folder_bar/file.csv
或long/path/to/folder_bar/file.csv
.
基本上我想在 Path 对象中将 folder_foo
重命名为 folder_bar
。
编辑:示例路径代码
csv_path = Path("long/path/to/folder_foo/file.csv")
尝试次数
1
csv_path.parents[0] = csv_path.parents[0] + "_clean")
这会导致错误 TypeError: unsupported operand type(s) for +: 'PosixPath' and 'str'
,这意味着您不能使用 +
将 PosixPath
与 str
组合,如 中所述。
2
为了解决这个问题,我尝试了以下方法:
csv_path.parents[0] = Path(str(csv_path.parents[0]) + "_clean")
然而这会导致错误:TypeError: '_PathParents' object does not support item assignment
.
因为PosixPath
不是一个列表,这个错误是可以理解的。
3
也许 .parts
是更好的方法,但是
csv_path.parts[-2] = csv_path.parts[-2][:-3] + "bar"
结果:TypeError: 'tuple' object does not support item assignment
。
问题
如何轻松重命名文件的父文件夹?
编辑:找到了一个没有 str()
的更干净的解决方案
csv_path2 = csv_path.parents[1] / (csv_path.parts[-2][:-3] + "bar") / csv_path.parts[-1]
# result
PosixPath('long/path/to/folder_bar/file.csv')
Path.parents
获取文件夹减去文件的完整路径。 Path.parents[1]
上升 2 层 (long/path/to/
),它仍然是一个 Path 对象。然后我们得到最后一个文件夹名称 csv_path.parts[-2]
,这是一个字符串。我们应用 [:-3]
来获取除 "foo"
之外的所有字符串字符。这意味着我们有 "folder_"
。然后使用 + "bar"
我们得到 "folder_bar"
,它被添加到我们的 Path
对象。最后,我们使用 / csv_path.parts[-1]
.
将文件名重新添加到我们的 Path
对象中
破解之类的解决方案
csv_path = Path(str(csv_path.parents[0])[:-3] + 'bar/' + csv_path.parts[-1])
然而,在我看来这有点不直观。应该有更干净的解决方案?
为了便于阅读,宁愿将其拆分:
bar_folder = csv_path.parent.parent / 'folder_bar'
csv_path2 = bar_folder / csv_path.name
将目标文件夹作为变量还可以让您创建文件夹,例如:
bar_folder.mkdir(exist_ok=True)
您也可以编写一个小函数来替换您要更改的路径部分。这是一个可运行的示例:
from pathlib import Path
path1 = Path("a/b/c.txt")
path2 = Path("b/c.txt")
def rename_dir(path, src, dst):
# convert to list so that we can change elements
parts = list(path.parts)
# replace part that matches src with dst
parts[parts.index(src)] = dst
return Path(*parts)
rename_dir(path1, 'b', 'q')
#> PosixPath('a/q/c.txt')
rename_dir(path2, 'b', 'q')
#> PosixPath('q/c.txt')
创建于 2021-03-06 10:44:00 PST reprexlite v0.4.2
从 Python 3.4 添加的 pathlib library 的新 Path 包似乎是 os.path.join()
等方法的强大替代品,但我在工作时遇到了一些麻烦用它。
我有一条路径,可以是从 folder_foo/file.csv
到 long/path/to/folder_foo/file.csv
的任何路径。我用pandas读取了folder_foo
中的.csv文件,修改后想保存到folder_bar/file.csv
或long/path/to/folder_bar/file.csv
.
基本上我想在 Path 对象中将 folder_foo
重命名为 folder_bar
。
编辑:示例路径代码
csv_path = Path("long/path/to/folder_foo/file.csv")
尝试次数
1
csv_path.parents[0] = csv_path.parents[0] + "_clean")
这会导致错误 TypeError: unsupported operand type(s) for +: 'PosixPath' and 'str'
,这意味着您不能使用 +
将 PosixPath
与 str
组合,如
2
为了解决这个问题,我尝试了以下方法:
csv_path.parents[0] = Path(str(csv_path.parents[0]) + "_clean")
然而这会导致错误:TypeError: '_PathParents' object does not support item assignment
.
因为PosixPath
不是一个列表,这个错误是可以理解的。
3
也许 .parts
是更好的方法,但是
csv_path.parts[-2] = csv_path.parts[-2][:-3] + "bar"
结果:TypeError: 'tuple' object does not support item assignment
。
问题
如何轻松重命名文件的父文件夹?
编辑:找到了一个没有 str()
的更干净的解决方案csv_path2 = csv_path.parents[1] / (csv_path.parts[-2][:-3] + "bar") / csv_path.parts[-1]
# result
PosixPath('long/path/to/folder_bar/file.csv')
Path.parents
获取文件夹减去文件的完整路径。 Path.parents[1]
上升 2 层 (long/path/to/
),它仍然是一个 Path 对象。然后我们得到最后一个文件夹名称 csv_path.parts[-2]
,这是一个字符串。我们应用 [:-3]
来获取除 "foo"
之外的所有字符串字符。这意味着我们有 "folder_"
。然后使用 + "bar"
我们得到 "folder_bar"
,它被添加到我们的 Path
对象。最后,我们使用 / csv_path.parts[-1]
.
Path
对象中
破解之类的解决方案
csv_path = Path(str(csv_path.parents[0])[:-3] + 'bar/' + csv_path.parts[-1])
然而,在我看来这有点不直观。应该有更干净的解决方案?
为了便于阅读,宁愿将其拆分:
bar_folder = csv_path.parent.parent / 'folder_bar'
csv_path2 = bar_folder / csv_path.name
将目标文件夹作为变量还可以让您创建文件夹,例如:
bar_folder.mkdir(exist_ok=True)
您也可以编写一个小函数来替换您要更改的路径部分。这是一个可运行的示例:
from pathlib import Path
path1 = Path("a/b/c.txt")
path2 = Path("b/c.txt")
def rename_dir(path, src, dst):
# convert to list so that we can change elements
parts = list(path.parts)
# replace part that matches src with dst
parts[parts.index(src)] = dst
return Path(*parts)
rename_dir(path1, 'b', 'q')
#> PosixPath('a/q/c.txt')
rename_dir(path2, 'b', 'q')
#> PosixPath('q/c.txt')
创建于 2021-03-06 10:44:00 PST reprexlite v0.4.2