【问题标题】:Python 3.6 pathlib Path change name parent directoryPython 3.6 pathlib 路径改名父目录
【发布时间】:2018-06-21 02:18:10
【问题描述】:

pathlib library 的新 Path 包是从 Python 3.4 添加的,它似乎是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 组合起来,如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

问题

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

【问题讨论】:

    标签: python-3.x pathlib


    【解决方案1】:

    为了可读性,宁愿把它分开:

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

    将目标文件夹作为变量还可以让您创建文件夹,例如:

    bar_folder.mkdir(exist_ok=True)
    

    【讨论】:

      【解决方案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')
      

      reprexlitev0.4.2 于太平洋标准时间 2021 年 3 月 6 日 10:44:00 创建

      【讨论】:

        【解决方案3】:

        编辑:找到了一个没有 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])
        

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

        【讨论】:

          猜你喜欢
          • 2019-06-21
          • 1970-01-01
          • 2017-06-04
          • 2017-07-17
          • 2018-04-18
          • 1970-01-01
          • 2010-11-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多