2017-01-06 5 views
0

Так я пытаюсь переименовать список файлов с набором переименовывает так:Переименование несколько файлов

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 (файл находится в директории)

So Затем я попытался

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

Вы пытаетесь переименовать файл с именем '0001 'to' 0016.5', файл с именем '0002' на' 00041' и т. д. или сделать что-то еще? – NPE

+1

Вы последовательно переименовываете SAME-файл. конечно, после первого переименования исходный файл больше не существует, следовательно, ошибка. – Andrey

+0

asssuming theres больше напоминаний, чем те, которые были предоставлены, когда вы доберетесь до '0004', у вас будет больше, потому что' 0003' переименовывает '00042', поэтому включен' 0004' – WhatsThePoint

ответ

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

listdir возвращает все имена объектов (файлы, каталоги, ...) не полный путь. Вы можете построить полный путь, используя: os.path.join(). Ваших за цикл переименовывает все найденные объекты первого до 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) 
Смежные вопросы