所以我试图重命名一个具有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"))
...
但是在额外字符上有很多奇怪的重命名文件, 我在这做错了什么?
答案 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)