实现文件的自动分类
程序的实现
1 | import os |
遇到的问题
- os.path.isfile()用来判断是文件还是文件夹,os.path.isdir()用来判断是不是目录
- os.path.abspath()用来获取文件或目录的绝对路径,目录的绝对路径包含它本身这一级
- os.mkdir()只能创建一级目录,os.makedirs()可以递归创建目录
- os.rmdir()为删除目录,它只能删空目录,shutil.rmtree()可以递归删除非空目录,另外os.remove()用来删除文件,若路径指定文件不存在会报错
取出一个文件夹内所有文件(包括子文件夹)
程序实现
1 | import os |
遇到的问题
本来我是想dfs搜索所有文件夹的,然而我发现了os.walk()这个方便的函数,嗯,真香os.walk(top[,topdown=True[,onerror=None[,followlinks=False]]])是一个简单易用的文件、目录遍历器,帮助我们高效处理文件目录方面的事情,top为所要遍历的目录的地址,topdown为真优先遍历top目录,否则优先遍历子目录,followlinks为真,会遍历快捷方式实际所指目录;它的返回值是一个生成器,所以我们需要不断的遍历它,来获得我们需要的信息,每次遍历的对象都是返回的是一个三元组(root,dirs,files)
- root指的是当前正在遍历的这个文件夹的本身的绝对路径
- dirs是一个list,内容是当前遍历文件夹里的所有的文件夹的名称(不包含子目录)
- files也是list,内容是当前遍历文件夹里的所有文件的名称(不含子目录,且包含后缀名)
注意os.path.join(path,file)的使用,之前我没用这个,我写的我给注释了,真的丑
- shutil.move()与shutil.copy()函数,使用需要注意这个问题,它们分辨两个文件的方法是看它们的路径,即同一个文件分别放到两个不同路径下得到两个文件,这两个函数把这两个文件看成不同文件;另外,如果你把test文件夹下的文件test,使用shutil.move()移动或使用shutil.copy()复制到test文件夹下,即把某目录下的文件移动或复制到该目录下,这两种操作对于这两个函数都是不行的,会报错,如下面那张图片所示;
关于你想要把文件保存到哪个文件夹,在这里即是new_path,这个new_path不能是path的子目录;有这样一种情况,假如path下直接有一个文件test,也有你的new_path,你遍历path下的文件,把test包括其他所有文件(不包括子目录)放入new_path中,然后os.walk()便开始遍历path子目录,比如new_path,(实际上,new_path你是不希望被访问的,它是专门用来存放文件的)。然后你遍历new_path中的文件,比如test,你就又访问了一次这个文件,然后复制test放入new_path中;然后它就会报错,比如: