使用Python将目录重命名为包含在其中的文件名

3
我想重命名几个文件夹,以它们内部第一个文件的名称作为文件夹名称。
我正在尝试:
  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)

谢谢您!

2
你正在覆盖os.walk('。')返回的值。作为第一步,不要使用dirs = []files = []。将它们重命名为其他名称,例如dirList = []filesList = [] - Joel
1st file name ??? - Shijith
目录中第一个文件的名称 - paugrana
我认为你应该指定某种排序标准,os函数默认按字母顺序排序名称。 - Salvioner
是的,我知道,我指的是根据操作系统的第一个文件。 - paugrana
1个回答

2
你的代码有几个问题:
  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]表示“获取append函数返回值的第二个元素(请记住Python索引从0开始)”-但append不返回任何东西(它修改列表,而不是返回新列表),因此会失败(而且您也没有使用[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)

太棒了!非常感谢。它完美地工作了。还要感谢您花时间如此详细地解释代码。 - paugrana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接