【问题标题】:How does one rename multiple files within folders using python?如何使用python重命名文件夹中的多个文件?
【发布时间】:2015-08-26 07:00:15
【问题描述】:

“我的文档”中有超过 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。然后我希望它循环“我的文档”中的尽可能多的文件夹。我是 python 新手,任何帮助或建议将不胜感激。

【问题讨论】:

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

标签: python file python-3.x rename file-rename


【解决方案1】:

您不需要所有列表,只需即时重命名所有文件。

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?在操作它们之前,我是否不必遍历并创建所有这些名称的列表?我尝试按原样运行上面的代码,但它不起作用。如果您能更详细地解释一下,我将不胜感激。
  • 已修复错字。为什么不立即重命名文件?
  • 谢谢,现在我收到一条错误消息:`for folder_name in glob.glob(sys.argv[1]): IndexError: list index out of range。有什么想法吗?
  • for folder_name in os.listdir("."): if folder_name != 'boyaakaa.py' :
  • ^ 我将 glob.glob(sys.argv[1]) 更改为 os.listdir("."): 并添加了一个 if 语句,因此程序不会尝试编辑 .py 脚本和没问题,谢谢Dan ya da man
【解决方案2】:

这是我使用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)

[1] 免责声明:antipathy 是我的项目之一

【讨论】:

  • 这和pathlib 2.x 一样吗?
  • @Kevin:类似。它适用于 2.x 和 3.x,以及子类 bytes/str/unicode。
猜你喜欢
  • 2021-07-14
  • 2022-01-10
  • 2019-02-05
  • 2019-07-23
  • 2014-10-29
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多