Python递归查找文件并移动到一个目标目录
这个脚本应该要递归地遍历根目录下的所有文件,找到所有以*.mp4结尾的文件。然后打印出这些文件的列表,并显示它们的目录结构。接着,把这些文件移动到目标目录destDir。问题是,当我尝试把文件移动到新目录时,只有根目录下的文件会被移动到新位置。而根目录下的子目录里的文件在移动时会出现错误:
/Volumes/VoigtKampff/Temp/TEST/level01_test.mp4
/Volumes/VoigtKampff/Temp/TEST/Destination/2levelstest02.mp4
Traceback (most recent call last):
File "/Volumes/HomeFolders/idmo04/Desktop/ScriptsLibrary/Python/recursive_find.py", line 14, in <module>
shutil.move(root+filename, destDir+'/'+filename)
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/shutil.py", line 281, in move
copy2(src, real_dst)
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/shutil.py", line 110, in copy2
copyfile(src, dst)
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/shutil.py", line 65, in copyfile
with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: '/Volumes/VoigtKampff/Temp/TEST/Destination2levelstest02.mp4'
############## 这里是脚本
import fnmatch
import os
import shutil
rootPath = '/Volumes/VoigtKampff/Temp/TEST/'
destDir = '/Volumes/VoigtKampff/Temp/TEST2/'
matches = []
for root, dirnames, filenames in os.walk(rootPath):
for filename in fnmatch.filter(filenames, '*.mp4'):
matches.append(os.path.join(root, filename))
print(os.path.join(root, filename))
shutil.move(root+filename, destDir+'/'+filename)
2 个回答
2
把最后一行的 root + filename
改成 os.path.join(root, filename)
,就像前面两行那样?
8
恭喜你!你已经找到了 os.path.join()
这个函数。你甚至在你的 print
调用中使用了它。所以你只需要在 move()
函数中也使用它就可以了:
shutil.move(os.path.join(root, filename), os.path.join(destDir, filename))
(不过要小心,不要覆盖 destDir
中的任何东西。)