Python mkdir with parent and exist_ok not creating final directory

Python mkdir with parent and exist_ok not creating final directory

该代码正在遍历 sqlite3 数据库中的数据并创建目录以将信息提取到其中;但是,永远不会创建最终目录。应该是 DCIM/dir1 DCIM/dir2 DCIM...

for row in rows:
        localfile = row[0]
        fileloc = row[1]
        # Skip empty entries
        if not localfile or not fileloc:
                continue
        # Get path location of file, create it, ignore if exists
        path = Path(fileloc)
        mkpath = path.parent.absolute()
        targetpath = os.path.join(os.path.join(os.environ.get("HOME"), mkpath))
        print(f"Creating {targetpath}")
        if not os.path.exists(targetpath):
                #Path(os.path.dirname(targetpath)).mkdir(parents=True, exist_ok=True)
                os.makedirs(os.path.dirname(targetpath), 0o755, True)

我确定这不是最优的,但真正的问题是创建了 $HOME/DCIM 但 $HOME/DCIM/dir1 等。打印语句显示正确的输出:

Creating /usr/home/jim/DCIM/dir1
Creating /usr/home/jim/DCIM/dir2
Creating /usr/home/jim/DCIM/dir3
Creating /usr/home/jim/DCIM/dir4

但是DCIM是空的。我认为 parent 可能会被覆盖,但是在尝试使用 $HOME 并阅读文档后,这没有任何意义。我感觉它与调用 path.parent.absolute() 有关,但如果我尝试使用 os.path.dirname,我会得到相同的结果。抱歉,如果已经回答了这个问题,我发现很多“如何创建目录”但没有涵盖这个问题。对于任何格式问题也很抱歉 - 这是我第一次 post 这个 Whosebug。

由于targetpath的每个值已经是你要创建的每个目录的绝对路径,当你在上面调用os.path.dirname时,因为路径不以[=13=结尾],你把最后一个 / 右边的所有东西都砍掉(在你的例子中是内部目录)。

所以基本上你不需要在上面调用 os.path.dirname,只需要这样做:

os.makedirs(targetpath, 0o755, True)