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.csv或long/path/to/folder_bar/file.csv。
基本上我想在 Path 对象中重命名folder_foo为folder_bar。
编辑:示例路径代码
csv_path = Path("long/path/to/folder_foo/file.csv")
Run Code Online (Sandbox Code Playgroud)
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' 中所述。
为了解决这个问题,我尝试了以下方法:
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不是列表,所以这个错误是可以理解的。
也许.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)
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)
然而,在我看来,这有点不直观。应该有更干净的解决方案吗?
| 归档时间: |
|
| 查看次数: |
5275 次 |
| 最近记录: |