来自Python {3.4的pathlib library的新Path软件包似乎是os.path.join()
之类的方法的强大替代品,但是在使用它时遇到了一些麻烦。
我的路径可以是从folder_foo/file.csv
到long/path/to/folder_foo/file.csv
的任何路径。我用熊猫读取了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")
csv_path.parents[0] = csv_path.parents[0] + "_clean")
这会导致错误TypeError: unsupported operand type(s) for +: 'PosixPath' and 'str'
,这意味着您无法使用+
来将PosixPath
与str
结合起来,如TypeError: unsupported operand type(s) for +: 'PosixPath' and 'str'中所述。>
为解决此问题,我尝试了以下操作:
csv_path.parents[0] = Path(str(csv_path.parents[0]) + "_clean")
但是会导致错误:TypeError: '_PathParents' object does not support item assignment
。
由于PosixPath
不是列表,因此可以理解此错误。
也许.parts
是更好的方法,但是
csv_path.parts[-2] = csv_path.parts[-2][:-3] + "bar"
结果:TypeError: 'tuple' object does not support item assignment
。
如何轻松重命名文件的父文件夹?
答案 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)
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])
但是,在我看来,这有点不直观。应该有一个更干净的解决方案吗?