我的剧本:
from os import walk, path, rename
def rename(source, dest):
for root, sub, files in walk(source):
for file in files:
if file.endswith('.mp4'):
nbase = file.split('.mp4')[0]
newname = nbase[0:len(nbase) - 12] + '.mp4'
nsource = path.join(root, file)
rdest = path.join(dest,newname)
rename(nsource,rdest)
s = '/Users/ja/Desktop/t'
d = '/Users/ja/Desktop/u'
rename(s,d)
这行脚本行将在ipython中运行,重命名并重定位文件而不会出现问题。当在sublimetext或textedit中编写脚本并保存时,它不会抛出任何错误,但什么也不做。我在macOS mojave上。
问题是你给你的函数命名为rename
,但在函数内部你也试图使用名称rename
来调用os.rename
。结果是从未调用过os.rename
。相反,您的函数使用旧的和新的文件名作为参数对其自身进行递归调用。
那个递归调用什么也没做,因为walk(source)
在传递文件名时没有返回任何内容。最终结果是一个程序,它正确地遍历旧目录树,但从不对它在该树中找到的文件做任何事情。
要修复,请为您的函数指定一个不与os.rename
冲突的名称。也许像rename_in_tree
。或者,导入os.rename
,其名称不是rename
(from os import rename as os_rename
),并通过函数内部的新名称调用它。
我不知道这在ipython
如何发生。 REPL处理程序有时会使用命名范围做一些奇怪的事情,但是它会以某种方式调用os.rename
而不是对函数进行递归调用似乎很奇怪。