重命名多个文件

时间:2017-01-06 14:46:01

标签: python

所以我试图重命名一个具有set renames的文件列表,如下所示:

import os
import time
for fileName in os.listdir("."):
    os.rename(fileName, fileName.replace("0001", "00016.5"))
    os.rename(fileName, fileName.replace("0002", "00041"))
    os.rename(fileName, fileName.replace("0003", "00042"))
...

但是这给了我这个错误os.rename(fileName, fileName.replace("0002", "00041"))``OSError: [Errno 2] No such file ordirectory(文件在目录中)

接下来我尝试了

import os
import time
for fileName in os.listdir("."):
    os.rename(fileName, fileName.replace("0001", "00016.5"))
for fileName in os.listdir("."):
    os.rename(fileName, fileName.replace("0002", "00041"))
for fileName in os.listdir("."):
    os.rename(fileName, fileName.replace("0003", "00042"))
...

但是在额外字符上有很多奇怪的重命名文件, 我在这做错了什么?

2 个答案:

答案 0 :(得分:1)

多次重命名重命名同时重命名并不意味着您的某些文件包含0001模式以及0002模式。

因此,当只进行一个循环时,您将重命名文件,但是您会获得旧文件列表(listdir返回list,因此一旦重命名文件就会过时) =>找不到某些源文件。

在进行多次传递时,您正在对某些文件应用多次重命名。

这可行(并且更紧凑):

for fileName in os.listdir("."):
    for before,after in (("0001", "00016.5"),("0002", "00041"),("0003", "00042")):
        if os.path.exists(fileName):
            newName = fileName.replace(before,after)
            # file hasn't been renamed: rename it (only if different)
            if newName != fileName:
                os.rename(fileName,newName)

基本上我不会重命名文件(如果它不存在(这意味着它已在前一次迭代中重命名)。所以只有一个重命名可能。你只需要优先考虑哪一个。

答案 1 :(得分:1)

listdir返回所有对象的名称(文件,目录,...)而不是完整路径。您可以使用:os.path.join()构造完整路径。 你的for循环重命名,所有找到的对象首先重命名为00016.5,然后重命名为00041 ......

重命名文件的一种方法是:

import os
import time

currentDir = os.pathdirname(__file__)
for fileName in os.listdir(currentDir):
    if '0001' in fileName:
        oldPath = os.path.join(currentDir, fileName)
        newPath = os.path.join(currentDir, fileName.replace("0001", "00016.5"))
    elif '0002' in fileName:
        oldPath = os.path.join(currentDir, fileName)
        newPath = os.path.join(currentDir, fileName.replace("0002", "00041"))
    else:
        continue

    os.rename(oldPath, newPath)