Ошибка Windows 183 в os.rename()

#Opens a directory and outputs a text file there that lists every subdirectory in it

import os
from shutil import move

pathname = raw_input('Enter path for music directory (ex. C:\\Music): ')
fn = raw_input('Enter desired file name for all converted files: ')
ft = raw_input('Enter the file extension you want the program to look for (ex. .jpg): ')
changepath = []
os.chdir(pathname)
for path, subdirs, files in os.walk(pathname):
        for name in files:
            changepath.append(os.path.join(path, name))
for idx, val in enumerate(changepath):
    if val.lower().endswith(ft):
        os.rename(val, (fn + ft))
print('Complete')

Я использую это, чтобы переименовать все обложки альбомов в моей музыкальной папке в одно, что-то вроде new.jpg.

Этот код не работает в строке 16 "os.rename(val, (fn + ft))" с ошибкой 183. Когда я использую "os.rename(val, val + (fn + ft))", он работает, но вызывает файл что-то вроде old.jpgnew.jpg вместо new.jpg, чего я и хочу.

Когда код дает сбой (написанный так, как в блоке выше), я получаю файл new.jpg в каталоге музыки. Это переименованная обложка альбома первого подкаталога, но никакие файлы обложек альбомов после первого не переименовываются. После успешного переименования первого изображения происходит сбой, но по какой-то причине он перемещается из исходного каталога в родительский каталог «Музыка».


person SciurusDoomus    schedule 09.03.2013    source источник


Ответы (1)


Обновленный ответ

Хорошо, я не видел той части, где применялся другой метод. Этот:

os.rename(val, (fn + ft))

to:

os.rename(val, (os.path.dirname(val) + fn + ft))

это, наверное, то, что вы хотите

Старый ответ

Ошибка 183 в Windows относится к уже существующий файл. Немного просмотрев ваш код:

fn = raw_input('Enter desired file name for all converted files: ')
ft = raw_input('Enter the file extension you want the program to look for (ex. .jpg): ')

Здесь нет очевидной информации о пути, поэтому:

for idx, val in enumerate(changepath):
    if val.lower().endswith(ft):
        os.rename(val, (fn + ft))

Где находится путь для fn + ft? Основываясь на вашей логике, он просто окажется там, куда вы изначально направили. Учитывая, что fn и ft кажутся статическими значениями, именно поэтому вы получите, что файл уже существует.

person cwgem    schedule 09.03.2013
comment
Это то, что я пытался исправить, говоря os.rename(val, val + (fn + ft)). Проблема в том, что старое имя файла является частью val. - person SciurusDoomus; 09.03.2013
comment
@SciurusDoomus Хорошо, я смотрел на блок кода и ожидал, что это будет последний код. Обновил ответ для вас. - person cwgem; 09.03.2013
comment
К сожалению, я получаю ложное срабатывание. Когда я смотрю на папки, файл, который я переименовал, просто имеет имя файла folder.jpg, добавленное к имени файла. Файл также перемещается из исходного каталога в каталог над ним. См. здесь imgur.com/wvjovGW - person SciurusDoomus; 09.03.2013