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

时间:2018-06-21 02:18:10

标签: python-3.x pathlib

来自Python {3.4的pathlib library的新Path软件包似乎是os.path.join()之类的方法的强大替代品,但是在使用它时遇到了一些麻烦。

我的路径可以是从folder_foo/file.csvlong/path/to/folder_foo/file.csv的任何路径。我用熊猫读取了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结合起来,如TypeError: unsupported operand type(s) for +: 'PosixPath' and '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

问题

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

3 个答案:

答案 0 :(得分:2)

您也可以编写一个小函数来替换您要更改的路径部分。这是一个可运行的示例:

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 by reprexlite v0.4.2

答案 1 :(得分:1)

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

bar_folder = csv_path.parent.parent / 'folder_bar'
csv_path2 = bar_folder / csv_path.name

将目标文件夹作为变量也可以使您使用以下方式创建文件夹:

bar_folder.mkdir(exist_ok=True)

答案 2 :(得分: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')

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

像黑客一样的解决方案

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

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