Python 3.6 pathlib 路径更改名称父目录

Num*_*uis 6 python-3.x pathlib

来自 Python 3.4的pathlib 库中的新 Path 包似乎是诸如 等方法的强大替代品os.path.join(),但我在使用它时遇到了一些麻烦。

我有一条路径可以是从folder_foo/file.csv到的任何内容long/path/to/folder_foo/file.csv。我folder_foo用 Pandas读取了 .csv 文件,修改了它并想将它保存到folder_bar/file.csvlong/path/to/folder_bar/file.csv

基本上我想在 Path 对象中重命名folder_foofolder_bar

编辑:示例路径代码

csv_path = Path("long/path/to/folder_foo/file.csv")
Run Code Online (Sandbox Code Playgroud)

尝试

1

csv_path.parents[0] = csv_path.parents[0] + "_clean")
Run Code Online (Sandbox Code Playgroud)

这会导致错误TypeError: unsupported operand type(s) for +: 'PosixPath' and 'str',这意味着您不能+将 aPosixPath与 a结合使用str,如TypeError: unsupported operand type(s) for +: 'PosixPath' 和 'str' 中所述

2

为了解决这个问题,我尝试了以下方法:

csv_path.parents[0] = Path(str(csv_path.parents[0]) + "_clean")
Run Code Online (Sandbox Code Playgroud)

然而,这会导致错误:TypeError: '_PathParents' object does not support item assignment

由于PosixPath不是列表,所以这个错误是可以理解的。

3

也许.parts是更好的方法,但是

csv_path.parts[-2] = csv_path.parts[-2][:-3] + "bar"
Run Code Online (Sandbox Code Playgroud)

结果:TypeError: 'tuple' object does not support item assignment

如何轻松重命名文件的父文件夹?

小智 5

宁愿将其拆分以提高可读性:

bar_folder = csv_path.parent.parent / 'folder_bar'
csv_path2 = bar_folder / csv_path.name
Run Code Online (Sandbox Code Playgroud)

将目标文件夹作为变量还使您能够使用例如以下方法创建文件夹:

bar_folder.mkdir(exist_ok=True)
Run Code Online (Sandbox Code Playgroud)


Num*_*uis 0

编辑:找到一个没有 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')
Run Code Online (Sandbox Code Playgroud)

Path.parents获取文件夹的完整路径减去文件。Path.parents[1]向上 2 层 ( long/path/to/),它仍然是一个 Path 对象。然后我们得到最后一个文件夹名称csv_path.parts[-2],它是一个字符串。我们申请[:-3]获取除 之外的所有字符串字符"foo"。这意味着我们有"folder_". 然后+ "bar"我们 get "folder_bar",它被添加到我们的Path对象中。最后,我们将文件名重新添加到我们的Path对象中/ csv_path.parts[-1]

像黑客一样的解决方案

csv_path = Path(str(csv_path.parents[0])[:-3] + 'bar/' + csv_path.parts[-1])
Run Code Online (Sandbox Code Playgroud)

然而,在我看来,这有点不直观。应该有更干净的解决方案吗?