以前的手机不用了,许多老照片和其他文件都散落在各个位置,不好整理。一个一个的翻阅的话,如果文件都在好几层文件夹之中那么想收集起来这些文件将会异常困难,会很慢还可能会漏掉某些文件,不如用脚本把所有文件都列出来。从网上找类似的工具,竟然没有找到。就尝试着自己写一个。
基本思路(和爬虫基本思想差不多)就是递归的遍历文件夹,找到文件夹继续访问,找到文件就打印出来。
实现方法是采用了栈数据结构,能够把递归的算法转化成迭代的算法(使用内存中的栈代替系统栈)。使得递归深度可以不受系统栈空间影响(既递归深度可以变得非常深),也可以使算法易读易控制。其实这里使用队列或者其他数据结构也可以,只要保证每个数据只访问一次就可以,使用队列实现只是文件访问的顺序不同罢了。
下面是代码:
import os
import shutil
def copyfile(srcfile,dstfile):
if not os.path.isfile(srcfile):
print( "%s not exist!"%(srcfile))
else:
fpath,fname=os.path.split(dstfile) #分离文件名和路径
if not os.path.exists(fpath):
os.makedirs(fpath) #创建路径
shutil.copyfile(srcfile,dstfile) #复制文件
print ("copy %s -> %s"%( srcfile,dstfile))
mainPath="I:"#这里是要递归遍历的文件夹名称或者盘符名字
folders=os.listdir(mainPath)#列出某个文件夹下的所有文件
allFile=[]#存放所有的文件
stack=[]#这是栈,用来实现迭代和存放数据。
for f in folders:
stack.append(mainPath +"/" +f)#栈数据结构中存放所有文件
while True:
path=stack.pop()#弹出一个路径进行判断,
if os.path.isdir(path):#如果这个路径是一个文件夹,就把它下面的内容加入到栈中下次访问
_folders=os.listdir(path)
for _folder in _folders:
stack.append(path+"/" +_folder)
else:#如果这个路径是一个文件,就输出出来
allFile.append(path)
print(path)
if len(stack)==0:
break
如果想把找到的文件中的制定后缀的文件复制到一个固定的文件夹,就按照下面的步骤:
suffixes=['gif','png','mp4','mp3','3gp','jpg']
for file in allFile:
for suffix in suffixes:
if file.lower().find(suffix)!=-1:
fpath,fname=os.path.split(file)
copyfile(file,"E:/file/" + suffix + "/"+fname)
上面是采用的如果文件名字里面有某个关键字就代表有后缀,你也可以稍加修改取出后缀判断。
这样就可以把所有的文件放在一块然后进行处理了。