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.csvlong/path/to/folder_foo/file.csv 的任何路径。我用pandas读取了folder_foo中的.csv文件,修改后想保存到folder_bar/file.csvlong/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',这意味着您不能使用 +PosixPathstr 组合,如 中所述。

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