使用 Python 创建递增的文件夹名称

Posted

技术标签:

【中文标题】使用 Python 创建递增的文件夹名称【英文标题】:Using Python to create incrementing folder names 【发布时间】:2014-08-06 14:00:30 【问题描述】:

我正在尝试将目录中的所有文件放入它自己的单独文件夹中。当试图声明变量“文件夹”时,我枚举文件列表并尝试将枚举列表编号附加到文件夹名称的末尾,因此文件夹看起来像...... FOLDER_1, 文件夹_2, FOLDER_3, 其中尾随数字是通过枚举目录中的文件生成的。

但是我下面的代码将它们全部列为“FOLDER_0”,然后遇到覆盖错误,我的增量似乎不起作用,非常感谢我做错的任何方向。

PATH = "C:/Temp/"

def main(): 
    files = [ join(PATH, f) for f in listdir(PATH) if isfile(join(PATH, f)) ]

    for i, f in enumerate (files):
        folders = [ PATH+"FOLDER_"+str(i)+"/" for f in files ]

【问题讨论】:

确切的错误是什么? 在你的列表理解之后files 是什么样的? 你希望在 for 循环之后的 folders 中有什么?现在你遍历文件但在任何地方都使用f,即最后一行相当于文件夹= [PATH+“FOLDER_”+str(i)+“/”] * len(files),这可能不是你想要的。此外,您使用了变量f 两次(外循环和内循环),这确实可能会导致问题。 每次执行for 循环时,都会创建一个新变量folders。您必须在for循环之前初始化一个空变量folders = [],然后使用list.append()方法或+=运算符添加一个新项:folders.append([ PATH+"FOLDER_"+str(i)+"/" for f in files ]) 但是,我看到了更多的差异。如果不需要,为什么要使用enumerate?您也可以使用:for i in range(len(files)) 或为files 变量创建一个单行函数:folders = [ PATH+"FOLDER_"+str(i)+"/" for i in range(len(files)) ] 【参考方案1】:

目前尚不清楚您的最终目标是什么,但根据您在代码中显示的内容和在您的问题中所写的内容,我想我可以尝试一下。

要启动 python 使用从零开始的索引,因此与enumerate 中的第一项对应的第一个值将是0

接下来你的for循环相当于做这样的事情:

      folders = [PATH + "FOLDER_" + str(len(files))] * len(files)

      所以对于...

      files=["file1", "file2"]

      你会得到...

      folders=["FOLDER_1", "FOLDER_1"]

这很可能是间接出现“覆盖错误”的地方。如果您尝试在 folders 中创建每个文件夹,您会收到一个 OSError,告诉您正在创建一个刚刚创建的文件夹。

如果您想为目录中的每个文件创建一个文件夹,我会尝试将您的代码修改为这个方向:

PATH = "C:/Temp/"

def main():
    files = [join(PATH, f) for f in listdir(PATH) if isfile(join(PATH, f))]
    folders = [join(PATH, "FOLDER_".format(i + 1)) for i, _ in enumerate(files)]
    ...

然后,如果您要在 folders 中创建所有文件夹,请检查它们是否还没有 exist

【讨论】:

非常感谢 MrAlias,您的解决方案正是我想要的,而且比我原来的方法更有效。干杯!

以上是关于使用 Python 创建递增的文件夹名称的主要内容,如果未能解决你的问题,请参考以下文章

从 Access VBA 自动增量创建的文件夹名称

如何在 Python 中创建递增的文件名?

Python:如何根据给定文件夹的内容创建名称列表?

使用列表理解 Python 创建新列

以 RESTful 方式递增资源计数器:PUT 与 POST

尝试编写 MacOS 自动化脚本以根据扫描的输入创建递增文件夹