【问题标题】:Create directories based on filenames根据文件名创建目录
【发布时间】:2014-04-23 21:53:47
【问题描述】:

我是编程的绝对初学者,所以如果这真的很基础,我深表歉意。我查看了其他似乎相关的问题,但还没有找到解决这个特定问题的方法——至少不是我能理解的。

我需要生成一个目录中的文件列表;为每个文件创建一个单独的目录,目录名称基于每个文件的名称;并将每个文件放在其对应的目录中。

【问题讨论】:

  • “基于每个文件的名称”是什么意思?请更具体。
  • Merlin2011,也许举个例子会有所帮助。
  • 比如文件名是foo,那么目录名应该是PREFIX_foo吗?或者foo 第一个字母大写?
  • 前。在一个目录中,我有 21 个文件:7 个具有 Austin 的基本名称和不同的扩展名;七个命名为 Syracuse,具有相同的七个扩展名;七个命名为 Davenport,同样有七个不同的扩展名。从我的脚本中,我希望能够读取此文件夹或任何文件夹,确定基本名称(本例中的 Austin、Syracuse 和 Davenport),为每个基本名称创建一个新文件夹(因此,三个名为 Austin、Syracuse 和Davenport),并将所有 Austin 文件移动到 Austin 文件夹,将 Syracuse 文件移动到 Syracuse 文件夹,将 Davenport 文件移动到 Davenport 文件。有意义吗?
  • (抱歉——我超时了,所以我刚刚重新提交了我的示例,现在。)

标签: python filenames directory


【解决方案1】:

您应该看看globosshutil 库。

我为你写了一个例子。这将删除给定文件夹中每个文件的文件扩展名,创建一个新的子目录,并将文件移动到相应的文件夹中,即:

C:\Test\
 -> test1.txt
 -> test2.txt

会变成

C:\Test\
 -> test1\
    -> test1.txt
 -> test2\
    -> test2.txt

代码:

import glob, os, shutil

folder = 'C:/Test/'

for file_path in glob.glob(os.path.join(folder, '*.*')):
    new_dir = file_path.rsplit('.', 1)[0]
    os.mkdir(os.path.join(folder, new_dir))
    shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))

如果文件夹已经存在,这将引发错误。为避免这种情况,请处理异常:

import glob, os, shutil

folder = 'C:/Test/'

for file_path in glob.glob(os.path.join(folder, '*.*')):
    new_dir = file_path.rsplit('.', 1)[0]
    try:
        os.mkdir(os.path.join(folder, new_dir))
    except WindowsError:
        # Handle the case where the target dir already exist.
        pass
    shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))

PS:这不适用于没有扩展名的文件。考虑为这种情况使用更健壮的代码。

【讨论】:

  • 感谢所有这些!我会试试看它是否适合我。
【解决方案2】:

这里有一些关于listing files using Python的建议。

要创建目录,请使用os.mkdir (docs)。要移动文件,请使用 os.rename (docs) 或 shutil.move (docs)。

【讨论】:

  • 谢谢,我会研究这些主题!