2016-06-06 4 views
0

Моя структура папок выглядит следующим образомПереименование файлов с помощью вложенных имен папок

Folder A(Parent folder) 

    Folder B(Sub folder) 

    1.jpg 
    2.jpg 
    3.jpg 
    4.jpg 

    Folder B1(Sub folder) 

    1.jpg 
    2.jpg 
    3.jpg 
    4.jpg 

    ..... 

    Folder Bn(Sub folder) 

    1.jpg 
    2.jpg 
    ...jpg 

Как переименовать .jpeg имена файлов с именами папок, подразделам, как этот B-1.jpg B-2.jpg ... и B1-1.jpg, B1-2.jpg ... и Bn-1.jpg, Bn-2.jpg ....

Мой код до сих пор (я принял код от этого question:

import os 
path = os.getcwd() 
# get all directories 
folders = ([name for name in os.listdir(path) 
     if os.path.isdir(os.path.join(path, name))]) 
for folder in folders: 
    for fname in os.listdir(os.path.join(path,folder)): 
    new_fname = os.path.basename(os.path.join(path,folder)) + fname.split('.') **# I think error is in here** 
    os.rename(os.path.join(path, fname), os.path.join(path, new_fname)) 

когда я запускаю код, он просто показывает:

Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
TypeError: cannot concatenate 'str' and 'list' objects 

Я новичок в python, пожалуйста, помогите и сделайте это полным и совершенным, пожалуйста.

+0

Посмотрите этот пост http://stackoverflow.com/questions/641985/rename-files-python-jython?rq=1 –

ответ

0

Возьмите os.walk('pathToRootDir'), чтобы получить рекурсивные подпапки.

На следующем шаге попытаться отлаживать с помощью инструкций печати как

print fname.split('.') 

Вы найдете ошибку самостоятельно, может принять более глубокий взгляд в функцию раскола и попробовать что-то вроде:

print fname.split('.')[0] 
+0

Что случилось с этим ответ, почему downvote? – rocksteady

+1

Упрощенный. os.walk кажется логичным способом пойти с этим. –

1

Завершая скальный ответ, вы можете использовать os.walk и os.path.

ROOT_DIR=os.getcwd() 
for root, dirs, files in os.path.walk(ROOT_DIR): 
    dname = os.path.split(root)[-1] 
    for file in files: 
     os.rename(os.path.join(root, file), 
        os.path.join(root, "{}-{}".format(dname, file)) 

Во всяком случае, реальная проблема на вашем коде, что «раскол» есть, что выводит список, и вы не можете сцепить список в строку.

Основываясь на ваших примерах вопрос вы хотите:

new_fname = os.path.basename(os.path.join(path,folder)) + fname 
Смежные вопросы