フォルダ内のすべてのファイルの名前を一括して変更するスクリプトを作成しています。私はモジュラー化しようとしているので、コアのアルゴリズム(新しいファイル名を生成するアルゴリズム)は簡単に交換できます。ここで予期しない名前エラー
は、私がこれまで持っているものです:
今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を実行していて、新しい名前を定義しているはずです。 私は1時間以上私の間違いを解明しようとしていました。私はコード全体を2行目の行に入力していましたが、うまくいきました。問題を理解できないようです。
誰かが私がどこに間違っているのか理解してもらえますか?
編集: は、私はすでにあなたが幹部を使用して名前を割り当てることができない可能性があります推測してきましたので、以下のように私はそれをテストしてみた、それが働いた:
>>> exec('cat="test"')
>>> cat
'test'
ええと、ugh、ugh !!!!このように 'exec'を使わないでください!人々が自分の名前をつくって_関数を書くことを許可して、それらの周りを渡しましょう! – katrielalex