接上节课内容,在开始正式移动文件到目标文件夹之前,我们需要再思考一个问题。
在代码运行之前,阿文的下载文件夹里已经存在一些分类文件夹了,比如图例中“PDF文件”这个文件夹就是已经存在的。
这样的话,在程序运行时,按目前的逻辑,计算机就会把这个文件夹分类为其他文件,因为这个文件夹没有后缀名。
因此,每运行一遍代码,之前已经创建的文件夹都会被移动到“其他文件”这个文件夹下。
为了避免将文件夹移动到其他文件中,我们需要先判断该文件是否是文件夹,不是文件夹再移动。
修改代码
使用os.path.join()函数拼接文件路径,并赋值给变量itemPath。 |
我们先使用 os.path.join() 函数拼接出文件目前所在路径,也就是使用下载文件夹的路径和文件名进行合并。图例中我们先将合并后的文件路径赋值给变量 itemPath ,然后使用print输出itemPath。 |
# 使用import导入os模块 import os # 将阿文的下载文件夹路径 /Users/yequ/Downloads 赋值给变量downloadPath downloadPath = "/Users/yequ/Downloads" # 使用os.listdir()函数获取该路径下所有的文件(夹),并赋值给变量allItems allItems = os.listdir(downloadPath) # 使用for循环遍历所有文件(夹) for item in allItems: # 获取文件后缀名 extension = os.path.splitext(item)[1].lower() # 定义一个变量targetPath,用来表示准备移动到的文件夹路径 targetPath = "" if extension in [".jpg", ".jpeg", ".gif", ".png", ".bmp"]: # 使用os.path.join()函数拼接分类文件夹路径:图片文件 targetPath = os.path.join(downloadPath, "图片文件") elif extension in [".avi", ".mp4", ".wmv", ".mov", ".flv"]: # 使用os.path.join()函数拼接分类文件夹路径:视频文件 targetPath = os.path.join(downloadPath, "视频文件") elif extension in [".wav", ".mp3", ".mid", ".ape", ".flac"]: # 使用os.path.join()函数拼接分类文件夹路径:音频文件 targetPath = os.path.join(downloadPath, "音频文件") elif extension in [".pdf"]: # 使用os.path.join()函数拼接分类文件夹路径:PDF文件 targetPath = os.path.join(downloadPath, "PDF文件") elif extension in [".docx", ".doc"]: # 使用os.path.join()函数拼接分类文件夹路径:Word文件 targetPath = os.path.join(downloadPath, "Word文件") elif extension in [".xlsx", ".xls"]: # 使用os.path.join()函数拼接分类文件夹路径:Excel文件 targetPath = os.path.join(downloadPath, "Excel文件") elif extension in [".pptx", ".ppt"]: # 使用os.path.join()函数拼接分类文件夹路径:PPT文件 targetPath = os.path.join(downloadPath, "PPT文件") else: # 使用os.path.join()函数拼接分类文件夹路径:其他文件 targetPath = os.path.join(downloadPath, "其他文件") # 如果目标文件夹不存在,使用os.mkdir()函数创建文件夹 if not os.path.exists(targetPath): os.mkdir(targetPath) # 使用os.path.join函数拼接文件路径,并赋值给变量itemPath itemPath = os.path.join(downloadPath, item)
# 使用print()输出文件路径 print(itemPath) |
判断路径是否是文件夹
我们将要进行判断的文件路径传入到 os.path.isdir() 函数中,如果该路径是文件夹就会返回True,如果不是就返回False。 |
判断当itemPath路径是一个文件夹时,输出变量itemPath。 |
将文件路径传入 os.path.isdir() 函数中,由于该函数返回的是布尔数。 |
# 使用import导入os模块 import os # 将阿文的下载文件夹路径 /Users/yequ/Downloads 赋值给变量downloadPath downloadPath = "/Users/yequ/Downloads" # 使用os.listdir()函数获取该路径下所有的文件(夹),并赋值给变量allItems allItems = os.listdir(downloadPath) # 使用for循环遍历所有文件(夹) for item in allItems: # 获取文件后缀名 extension = os.path.splitext(item)[1].lower() # 定义一个变量targetPath,用来表示准备移动到的文件夹路径 targetPath = "" if extension in [".jpg", ".jpeg", ".gif", ".png", ".bmp"]: # 使用os.path.join()函数拼接分类文件夹路径:图片文件 targetPath = os.path.join(downloadPath, "图片文件") elif extension in [".avi", ".mp4", ".wmv", ".mov", ".flv"]: # 使用os.path.join()函数拼接分类文件夹路径:视频文件 targetPath = os.path.join(downloadPath, "视频文件") elif extension in [".wav", ".mp3", ".mid", ".ape", ".flac"]: # 使用os.path.join()函数拼接分类文件夹路径:音频文件 targetPath = os.path.join(downloadPath, "音频文件") elif extension in [".pdf"]: # 使用os.path.join()函数拼接分类文件夹路径:PDF文件 targetPath = os.path.join(downloadPath, "PDF文件") elif extension in [".docx", ".doc"]: # 使用os.path.join()函数拼接分类文件夹路径:Word文件 targetPath = os.path.join(downloadPath, "Word文件") elif extension in [".xlsx", ".xls"]: # 使用os.path.join()函数拼接分类文件夹路径:Excel文件 targetPath = os.path.join(downloadPath, "Excel文件") elif extension in [".pptx", ".ppt"]: # 使用os.path.join()函数拼接分类文件夹路径:PPT文件 targetPath = os.path.join(downloadPath, "PPT文件") else: # 使用os.path.join()函数拼接分类文件夹路径:其他文件 targetPath = os.path.join(downloadPath, "其他文件") # 如果目标文件夹不存在,使用os.mkdir()函数创建文件夹 if not os.path.exists(targetPath): os.mkdir(targetPath) # 使用os.path.join函数拼接文件路径,并赋值给变量itemPath itemPath = os.path.join(downloadPath, item) # 使用if判断itemPath路径是一个文件夹时 if os.path.isdir(itemPath): # 使用print()输出itemPath print(itemPath) |
移动文件夹
要想移动文件,我们需要导入Python中另一个内置的模块 shutil ,然后使用 shutil.move() 函数来对文件进行移动。 |
代码修改 |
导入shutil模块。 |
阿文的需求,是把分好类的文件移动到对应的文件夹里。 所以我们只需在程序判断 itemPath 不是一个文件夹的时候,使用 shutil.move() 函数将itemPath路径的文件移动到targetPath路径的文件夹下。 |
# 使用import导入os模块 import os # 使用import导入shutil模块 import shutil # 将阿文的下载文件夹路径 /Users/yequ/Downloads 赋值给变量downloadPath downloadPath = "/Users/yequ/Downloads" # 使用os.listdir()函数获取该路径下所有的文件(夹),并赋值给变量allItems allItems = os.listdir(downloadPath) # 使用for循环遍历所有文件(夹) for item in allItems: # 获取文件后缀名 extension = os.path.splitext(item)[1].lower() # 定义一个变量targetPath,用来表示准备移动到的文件夹路径 targetPath = "" if extension in [".jpg", ".jpeg", ".gif", ".png", ".bmp"]: # 使用os.path.join()函数拼接分类文件夹路径:图片文件 targetPath = os.path.join(downloadPath, "图片文件") elif extension in [".avi", ".mp4", ".wmv", ".mov", ".flv"]: # 使用os.path.join()函数拼接分类文件夹路径:视频文件 targetPath = os.path.join(downloadPath, "视频文件") elif extension in [".wav", ".mp3", ".mid", ".ape", ".flac"]: # 使用os.path.join()函数拼接分类文件夹路径:音频文件 targetPath = os.path.join(downloadPath, "音频文件") elif extension in [".pdf"]: # 使用os.path.join()函数拼接分类文件夹路径:PDF文件 targetPath = os.path.join(downloadPath, "PDF文件") elif extension in [".docx", ".doc"]: # 使用os.path.join()函数拼接分类文件夹路径:Word文件 targetPath = os.path.join(downloadPath, "Word文件") elif extension in [".xlsx", ".xls"]: # 使用os.path.join()函数拼接分类文件夹路径:Excel文件 targetPath = os.path.join(downloadPath, "Excel文件") elif extension in [".pptx", ".ppt"]: # 使用os.path.join()函数拼接分类文件夹路径:PPT文件 targetPath = os.path.join(downloadPath, "PPT文件") else: # 使用os.path.join()函数拼接分类文件夹路径:其他文件 targetPath = os.path.join(downloadPath, "其他文件") # 如果目标文件夹不存在,使用os.mkdir()函数创建文件夹 if not os.path.exists(targetPath): os.mkdir(targetPath) # 使用os.path.join()函数拼接文件路径,并赋值给变量itemPath itemPath = os.path.join(downloadPath, item) # 判断当itemPath路径不是文件夹时,移动文件到分类文件夹去 if not os.path.isdir(itemPath): # 使用shutil.move()函数移动文件到targetPath路径 shutil.move(itemPath, targetPath) |
shutil.move()函数可以用来移动文件或文件夹。它接收两个参数,第一个参数是要移动的文件(夹)路径,第二个参数是目标文件(夹)的路径。 |
至此,我们帮助阿文编写的,对文件自动分类并移动的代码就全部完成啦。可以发现,几乎是一瞬间,几十个文件就全部分类并移动到指定的文件夹了。