python os.rename (…) не будет работать!

Я пишу функцию Python, чтобы изменить расширение списка файлов на другое расширение, например txt в rar, это просто простой пример. Но я получаю сообщение об ошибке. Код:

import os def dTask(): #Get a file name list file_list = os.listdir('C:\Users\B\Desktop\sil\sil2') #Change the extensions for file_name in file_list: entry_pos = 0; #Filter the file name first for '.' for position in range(0, len(file_name)): if file_name[position] == '.': break new_file_name = file_name[0:position] #Filtering done ! #Using the name filtered, add extension to that name new_file_name = new_file_name + '.rar' #rename the entry in the file list, using new file name print 'Expected change from: ', file_list[entry_pos] print 'into File name: ', new_file_name os.rename(file_list[entry_pos], new_file_name) ++entry_pos Error: >>> dTask() Expected change from: New Text Document (2).txt into File name: New Text Document (2).rar Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> dTask() File "C:\Users\B\Desktop\dTask.py", line 19, in dTask os.rename(file_list[entry_pos], new_file_name) WindowsError: [Error 2] The system cannot find the file specified 

Мне удастся получить имя файла с другим расширением на переменном уровне, как вы можете видеть в распечатке, но не на самом деле, потому что я не могу закончить этот процесс на уровне ОС. Ошибка возникает из os.rename (…). Любая идея, как это исправить?

6 Solutions collect form web for “python os.rename (…) не будет работать!”

  1. Как уже указывали другие, вам либо нужно предоставить путь к этим файлам, либо переключить текущий рабочий каталог, чтобы os мог найти файлы.

  2. ++entry_pos ничего не делает. В Python нет оператора инкремента. Префикс + – это просто симметрия с префиксом - . Префикс чего-то с двумя + – это всего лишь два бездействия. Таким образом, вы на самом деле ничего не делаете (и после того, как вы изменили его на entry_pos += 1 , вы все равно сбросите его на ноль на каждой итерации.

  3. Кроме того, ваш код очень неэлегантен – например, вы используете отдельный индекс в file_list и не можете синхронизировать его с переменной переменной file_name , хотя вы можете просто использовать ее! Чтобы показать, как это можно сделать лучше.

 def rename_by_ext(to_ext, path): if to_ext[0] != '.': to_ext = '.'+to_ext print "Renaming files in", path for file_name in os.listdir(path): root, ext = os.path.splitext(file_name) print "Renaming", file_name, "to", root+ext os.rename(os.path.join(path, file_name), os.path.join(path, root+to_ext)) rename_by_ext('.rar', '...') 

Вы также хотите удвоить обратную косую черту, чтобы избежать их в строках Python, поэтому вместо

 file_list = os.listdir('C:\Users\B\Desktop\sil\sil2') 

вы хотите

 file_list = os.listdir('C:\\Users\\B\\Desktop\\sil\\sil2') 

Или используйте косые черты – Python волшебным образом рассматривает их как разделители путей в Windows.

os.rename действительно не любит переменные. Используйте затвор. Пример, взятый из « Как скопировать и переместить файлы с помощью Shutil» .

 import shutil import os source = os.listdir("/tmp/") destination = "/tmp/newfolder/" for files in source: if files.endswith(".txt"): shutil.move(files,destination) 

В твоем случае:

 import shutil shutil.move(file_list[entry_pos], new_file_name) 

Вы должны использовать полный путь для переименования.

 import os def dTask(): #Get a file name list dir = 'C:\Users\B\Desktop\sil\sil2' file_list = os.listdir(dir) #Change the extensions for file_name in file_list: entry_pos = 0; #Filter the file name first for '.' for position in range(0, len(file_name)): if file_name[position] == '.': break new_file_name = file_name[0:position] #Filtering done ! #Using the name filtered, add extension to that name new_file_name = new_file_name + '.rar' #rename the entry in the file list, using new file name print 'Expected change from: ', file_list[entry_pos] print 'into File name: ', new_file_name os.rename( os.path.join(dir, file_list[entry_pos]), os.path.join(dir,new_file_name)) ++entry_pos 

Если вы не находитесь в каталоге C:\Users\B\Desktop\sil\sil2 , тогда Python, конечно же, не сможет найти эти файлы.

 import os def extChange(path,newExt,oldExt=""): if path.endswith != "\\" and path.endswith != "/": myPath = path + "\\" directory = os.listdir(myPath) for i in directory: x = myPath + i[:-4] + "." + newExt y = myPath + i if oldExt == "": os.rename(y,x) else: if i[-4:] == "." + oldExt: os.rename(y,x) 

теперь называйте это:

 extChange("C:/testfolder/","txt","lua") #this will change all .txt files in C:/testfolder to .lua files extChange("C:/testfolder/","txt") #leaving the last parameter out will change all files in C:/testfolder to .txt 
Python - лучший язык программирования в мире.