使用 Python 重命名目录,其中包含文件名

Rename a directory with a filename inside with Python

我正在尝试用其中第一个文件的名称重命名几个目录。

我正在尝试:

  1. 列出文件夹中的文件。
  2. 确定目录。
  3. 对于每个目录,访问它,获取其中第一个文件的名称并使用该名称重命名目录。

这是我目前得到的结果,但没有用。我知道代码是错误的,但在修复代码之前我想知道逻辑是否正确。有人可以帮忙吗?

import os

for (root, dirs, files) in os.walk('.'):
    print(f'Found directory: {dirpath}')
    dirlist = []
    for d_idx, d in enumerate(dirlist):
        print(d)
    filelist = []
    for f_idex, f in enumerate(filelist):
        files.append(f)[1] 
        print(f)
    os.rename(d, f)

谢谢!

您的代码中存在一些问题:

  1. 您在使用 os.walk 迭代目录时正在重命名目录。这不是一个好主意,os.walk 为您提供了一个生成器,这意味着它会在您迭代它们时创建元素,因此在循环中重命名会混淆它。
  2. for d_idx, d in enumerate(dirlist):for f_idex, f in enumerate(filelist): 都遍历在前一行中声明为空列表的变量,因此这些循环不执行任何操作。此外,在第二个中,files.append(f) 会将 f 附加到列表 files,但末尾的 [1] 表示 "get the second element (remeber Python indexing is 0-based) of the value returned by the append function" - 但 append 没有 return 任何东西(它修改列表,而不是 return 一个新列表),所以这会失败(而且你没有使用 [1] 读取的值,所以它会什么都不做)。
  3. os.rename(d, f) 中,首先,由于之前的循环永远不会 运行,df 将没有值,而且,假设两者 df 来自 dirsfiles,它们将作为相对于其父目录的路径给出,而不是相对于您的当前目录 (.),因此重命名会失败。

这段代码应该可以正常工作:

import os

# List of paths to rename
renames = []
# Walk current dir
for (root, dirs, files) in os.walk('.'):
    # Skip this dir (cannot rename current directory)
    if root == '.': continue
    # Add renaming to list
    renames.append((root, files[0]))
# Iterate renaming list in reverse order so deepest dirs are renamed first
for root, new_name in reversed(renames):
    # Make new full dir name (relative to current directory)
    new_full_name = os.path.join(os.path.dirname(root), new_name)
    # Rename
    os.rename(root, new_full_name)