我正在編寫腳本來批量重命名文件夾內的所有文件。我試圖使它成爲模塊化的,所以核心算法(生成新文件名的算法)很容易交換。意外的名稱錯誤
這裏是我到目前爲止有:
from os import listdir, rename
def renamer(path, algorithm, counter=False, data=None, data2=None, safe=True):
call_string = 'new=algorithm(i'
if counter:
call_string += ', file_index'
if data != None:
call_string += ', data'
if data2 != None:
call_string += ', data2'
call_string += ')'
if safe:
print('Press Enter to accept changes. '+
'Type anything to jump to the next file.\n')
files_list = listdir(path)
for i in files_list:
file_index = files_list.index(i)
old = i
exec(call_string)
if safe:
check = input('\nOld:\n'+old+'\nNew:\n'+new+'\n\nCheck?\n\n')
if check is not '':
continue
rename(path+old, path+new)
return
現在由於某種原因(似乎unexplicable對我來說),調用函數引發NameError:
>>> def f(s):
return 'S08'+s
>>> path='C:\\Users\\****\\test\\'
>>> renamer(path, f)
Press Enter to accept changes. Type anything to jump to the next file.
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
renamer(path, f)
File "C:\Python32\renamer.py", line 25, in renamer
check = input('\nOld:\n'+old+'\nNew:\n'+new+'\n\nCheck?\n\n')
NameError: global name 'new' is not defined
Unexplicable因爲,在第25行它應該已經執行了call_string,從而定義了新的名稱。 我一直試圖找出我的錯誤現在一個多小時,我已經通過了整個代碼輸入行的線兩次進入外殼,它運行良好,我似乎無法找出問題。
有人可以幫我找出我出錯的地方嗎?
編輯: 我已經猜到有可能不能分配使用EXEC的名字,所以我如下測試它,和它的工作:
>>> exec('cat="test"')
>>> cat
'test'
呃,呃,呃!!!!不要像這樣使用'exec'!讓人們寫出他們自己的名字,生成_functions_並傳給他們! – katrielalex