2015-06-10 4 views
3

У меня более 1000 папок в «моих документах». В каждой папке есть только 4 фотографии, которые нужно называть «Север», «Восток», «Юг» и «Запад» в этом порядке. В настоящее время они называются DSC_XXXX. Я написал этот скрипт, но он не выполняется.Как переименовать несколько файлов в папках с помощью python?

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 папок и сохранить их в папке-папке. Затем откройте каждую папку и сохраните 4 имени изображения в файле old_file_list. Оттуда я хотел бы использовать os.rename (old_file_list, newnames [i]), чтобы переименовать 4 фотографии на северо-восток Юг и Запад. Затем я хочу, чтобы в этом цикле было столько папок, что в «моих документах». Я новичок в python, и любая помощь или предложения были бы весьма признательны.

+0

Если новые имена применяются «в таком порядке, «вам нужно сначала отсортировать содержимое папки, потому что' os.listdir' возвращает произвольно упорядоченный «список». Кроме того, вы можете выполнять итерацию непосредственно над 'folder_list' вместо использования' range (len()) 'для работы с индексами. – TigerhawkT3

+0

О, и 'os.listdir()' уже возвращает 'list', поэтому вам не нужно перебирать его и строить новый. Просто сохраните ссылку на него: 'folder_list = os.listdir (sys.argv [1])'. – TigerhawkT3

+0

Кроме того, вам не нужно открывать() 'папки ... хотя вы все равно маскируете его с помощью переменной цикла. – TigerhawkT3

ответ

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)) 
+0

Спасибо, но я смущен. Если мне не нужны списки, как определить old_name и имя_папки? Разве мне не нужно было бы перебирать и создавать списки всех этих имен, прежде чем манипулировать ими? Я попытался запустить код выше, как есть, и он не работает. Если бы вы могли объяснить более подробно, я был бы признателен. – ErrorMaster

+0

Типичный фиксированный. Почему бы вам не переименовать файлы сразу? – Daniel

+0

Спасибо, теперь я получаю сообщение об ошибке 'для имя_папки в glob.glob (sys.argv [1]): IndexError: индекс индекса за пределами диапазона. Есть идеи? – 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) 

[1] отказ от ответственности: antipathy это один из моих проектов

+0

Это похоже на 'pathlib' для 2.x? – Kevin

+0

@Kevin: Похожее. Он работает как в версиях 2.x, так и 3.x, а также в подклассах 'bytes' /' str'/'unicode'. –

Смежные вопросы