2016-12-09 8 views
0

Я пытаюсь переименовать несколько файлов, хранящихся в подкаталогах, удалив последние четыре символа в их базовом имени. Я обычно использую glob.glob() для поиска и переименования файлов в одной директории с помощью:Как переименовать файлы с помощью os.walk()?

import glob, os 

for file in glob.glob("C:/Users/username/Desktop/Original data/" + "*.*"): 
    pieces = list(os.path.splitext(file)) 
    pieces[0] = pieces[0][:-4] 
    newFile = "".join(pieces)  
    os.rename(file,newFile) 

Но теперь я хочу повторить выше во всех подкаталогах. Я попытался с помощью os.walk():

import os 

for subdir, dirs, files in os.walk("C:/Users/username/Desktop/Original data/"): 
    for file in files: 
     pieces = list(os.path.splitext(file)) 
     pieces[0] = pieces[0][:-4] 
     newFile = "".join(pieces)  
     # print "Original filename: " + file, " || New filename: " + newFile 
     os.rename(file,newFile) 

print заявление правильно печатает оригинал и новые имена, которые я в поисках, но os.rename(file,newFile) возвращает следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "<input>", line 7, in <module> 
WindowsError: [Error 2] The system cannot find the file specified 

Как я могу решить эту проблему ?

+1

Я считаю, вы должны передать os.raname полного пути к файлу и так вы не являетесь в том же каталоге, что и прогулка ... –

+0

@RafaelRodrigoDeSouza - Спасибо, вы правы, как описано в ответе Ниемми =) – Joseph

ответ

2

Вы должны пройти полный путь к файлу до os.rename. Первый пункт tuple возвращенного os.walk является путь тока так просто использовать os.path.join, чтобы объединить его с именем файла:

import os 

for path, dirs, files in os.walk("./data"): 
    for file in files: 
     pieces = list(os.path.splitext(file)) 
     pieces[0] = pieces[0][:-4] 
     newFile = "".join(pieces) 
     os.rename(os.path.join(path, file), os.path.join(path, newFile)) 
+0

Отлично! Спасибо за ваш ответ :) – Joseph