如何使用Python重命名文件夹中的多个文件?

3

我在“我的文档”文件夹中有1000多个文件夹。每个文件夹中只有4张照片需要按顺序命名为“北”、“东”、“南”和“西”。目前它们被命名为DSC_XXXX。我写了这个脚本,但它没有执行。

import sys, os

folder_list = []
old_file_list = []
newnames = [North, South, East, West]

for file in os.listdir(sys.argv[1]):
    folder_list.append(file)

 for i in range(len(folder_list)):
    file = open(folder_list[i], r+)
    for file in os.listdir(sys.argv[1] + '/' folder_list[i]):
       old_file_list.append(file)
       os.rename(old_file_list, newnames[i])

我的思路是获取1000个文件夹的所有名称并存储在folder_list中。然后打开每个文件夹并将4个图片名称保存在old_file_list中。接下来,我想使用os.rename(old_file_list, newnames[i])将这4张照片重命名为North East South和West。然后,我希望它可以循环执行'my documents'中的所有文件夹。我是Python新手,任何帮助或建议都将不胜感激。


如果新名称按照“那个顺序”应用,您需要先对文件夹的内容进行排序,因为os.listdir返回一个任意排序的列表。此外,您可以直接迭代folder_list而不是使用range(len())来处理索引。 - TigerhawkT3
哦,而且 os.listdir() 已经返回了一个 list,所以你不需要迭代它并构建一个新的列表。只需保存一个引用:folder_list = os.listdir(sys.argv[1]) - TigerhawkT3
另外,你不需要使用open()函数来打开文件夹...尽管你在循环变量中进行了掩盖。 - TigerhawkT3
2个回答

3

您不需要列出所有文件,只需在进行操作时即可重命名所有文件。

import sys, os, glob

newnames = ["North", "South", "East", "West"]

for folder_name in glob.glob(sys.argv[1]):
    for new_name, old_name in zip(newnames, sorted(os.listdir(folder_name))):
       os.rename(os.path.join(folder_name, old_name), os.path.join(folder_name, new_name))

谢谢,但我有点困惑。如果我不需要列表,那么我如何定义old_name和folder_name?我难道不必循环遍历并创建所有这些名称的列表,然后再对它们进行操作吗?我尝试按原样运行上面的代码,但它没有起作用。如果您能更详细地解释一下,我会非常感激。 - ErrorMaster
错别字已经修正。为什么不能一次重命名所有文件? - Daniel
谢谢,现在我遇到了一个错误,它说 for folder_name in glob.glob(sys.argv[1]): IndexError: list index out of range。你有什么想法吗? - ErrorMaster
for folder_name in os.listdir("."): if folder_name != 'boyaakaa.py' : - ErrorMaster
我将glob.glob(sys.argv[1])更改为os.listdir("."),并添加了一个if语句,以便程序不会尝试编辑.py脚本,这样就没有问题了,谢谢Dan ya da man。 - ErrorMaster

1

以下是我使用antipathy [1]的方法:

# untested

from antipathy import Path

def check_folder(folder):
    "returns four file names sorted alphebetically, or None if file names do not match criteria"
    found = folder.listdir()
    if len(found) != 4:
        return None
    elif not all(fn.startswith('DSC_') for fn in found):
        return None
    else:
        return sorted(found)

def rename(folder, files):
    "rename the four files from DSC_* to North East South West, keeping the extension"
    for old, new in zip(files, ('North', 'East', 'South', 'West')):
        new += old.ext
        folder.rename(old, new)

if __name__ == '__main__':
    for name in Path.listdir(sys.argv[1]):
        if not name.isdir():
            continue
        files = check_folder(name)
        if files is None:
            continue
        rename(name, files)

免责声明:antipathy 是我的一个项目之一。

这是不是类似于2.x版本的pathlib - Kevin
@Kevin:类似。它可以在2.x和3.x中工作,并且可以子类化bytes/str/unicode - Ethan Furman

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