通过文件后缀名判断文件类型是不区分大小写的,.mp3和.MP3都表示音频文件。但在前面判断文件类型的代码中,我们只使用了小写的文件后缀名去进行匹配。 这样的话,比如像“xx.MP3”这个文件就被分类到了“其他文件”。
为了解决这个问题,我们可以对文件后缀名使用 lower() 函数。
sampleStr1 = "NATE".lower()
sampleStr2 = "Drake".lower()
print(sampleStr1)
print(sampleStr2)
学习了 lower() 函数后,我们现在把它应用到获取文件后缀名的代码中,将文件后缀名全部转换为小写。
转换之后,再使用之前的代码进行判断,“心动.MP3”就能被正确分类了。
# 使用import导入os模块
import os
# 将阿文的下载文件夹路径 /Users/yequ/Downloads 赋值给变量downloadPath
downloadPath = "/Users/yequ/Downloads"
# 使用os.listdir()函数获取该路径下所有的文件(夹),并赋值给变量allItems
allItems = os.listdir(downloadPath)
# 使用for循环遍历所有文件(夹)
for item in allItems:
# 获取文件后缀名并使用lower()函数转换成小写
extension = os.path.splitext(item)[1].lower()
if extension in [".jpg", ".jpeg", ".gif", ".png", ".bmp"]:
print(f"{item} 图片文件")
elif extension in [".avi", ".mp4", ".wmv", ".mov", ".flv"]:
print(f"{item} 视频文件")
elif extension in [".wav", ".mp3", ".mid", ".ape", ".flac"]:
print(f"{item} 音频文件")
elif extension in [".pdf"]:
print(f"{item} PDF文件")
elif extension in [".docx", ".doc"]:
print(f"{item} Word文件")
elif extension in [".xlsx", ".xls"]:
print(f"{item} Excel文件")
elif extension in [".pptx", ".ppt"]:
print(f"{item} PPT文件")
else:
print(f"{item} 其他文件")
在移动文件之前,我们首先需要确认文件的移动路径。
例如,要把某个文件移动到音频文件,就需要确定移动到哪里的音频文件夹中
我们首先需要确定目标文件夹的路径。
阿文的习惯,是将每一个分类文件夹创建在下载文件夹中。
例如,图片文件夹的路径为:/Users/yequ/Downloads/图片文件。该路径前半部分为下载文件夹的路径,后半部分为分类文件夹的名字。
在代码中,使用 os.path.join() 函数来拼接每个分类文件夹的路径
# 使用import导入os模块
import os
# 将文件路径 "/Users/yequ/Downloads" 赋值给downloadPath
downloadPath = "/Users/yequ/Downloads"
# 使用os.path.join()函数合并downloadPath和“音频文件”文件夹并赋值给变量targetPath
targetPath = os.path.join(downloadPath, "音频文件")
# 使用print输出变量targetPath
print(targetPath)
结果
/Users/yequ/Downloads/音频文件
如果目标文件夹不存在,需要先创建文件夹再移动。
例如:xx.mp3 需要移动到音频文件夹中,那么需要先检查 Downloads 文件夹中是否已经创建了音频文件夹。
得到了目标文件夹的路径后,我们可以使用 os.path.exists() 函数来判断该文件夹是否已经存在。
os.path.exists() 函数接受一个路径字符串作为参数,当该路径的文件夹存在时,返回True,不存在时,则返回False。
import os
print(os.path.exists("/Users/yequ/Downloads/PDF文件"))
print(os.path.exists("/Users/yequ/Downloads/音频文件"))
结果
True
False
使用 os.path.exists() 函数判断返回的结果是布尔数,邓老师要查看没有建的班级,我们就只输出未创建的文件夹名称。
if 语句用于判断当前条件的真假,只有满足条件时才会执行if语句中的内容。(在判断语句中,对非零值判断为真:对数字0的判断为假:对None的判断为假。)
我们要输出结果为 False 的班级,这里就需要使用关键字 not 运算符 搭配 os.path.exists() 函数,再使用 if语句 来判断结果并输出
# for循环遍历班级列表
for item in stuClass:
# 使用os.path.join()拼接班级列表,赋值给targetPath
targetPath = os.path.join(path, item)
# 使用os.path.exists()函数判断当目标文件夹不存在时
if not os.path.exists(targetPath):
# 使用格式化输出,x班
print(f"{item}")
在这里如果应该转移的文件夹不存在,结果为false。not false为true,满足条件执行if语句中的内容,输出不存在的文件夹名.
例题
Ivy老师的班级有20个学生,他们的名字分别是:James, Harry, Maggie, Joan, Judy, Fred, Roy, Billy, Louis, Tony, Kevin, Tracy, Vincent, Jay, Dean, Neil, Faye, Evan, Dana, Kelly。
现在Ivy老师让所有学生把证件照交给她,并以他们的名字来命名照片文件。例如:Harry.jpg
所有已经收到的照片被Ivy老师放到了电脑里的 /Users/ivy/证件照 文件夹下。
目前还有一些同学没有交照片,请运用学习过的文件操作相关知识,定义一个变量名为notSubList的列表,将还没有交照片同学的名字放入到列表中,最后使用print输出notSubList列表的内容。
注意:同学交上来的照片命名不完全规范,可能有全部小写和全部大写的情况。
# TODO 导入os模块
import os
# 所有的学生名字列表
studentList = ["James", "Harry", "Maggie", "Joan", "Judy", "Fred", "Roy", "Billy", "Louis", "Tony", "Kevin", "Tracy", "Vincent", "Jay", "Dean", "Neil", "Faye", "Evan", "Dana", "Kelly"]
# TODO 将路径 /Users/ivy/证件照 赋值给变量photoPath
photoPath="/Users/ivy/证件照"
# TODO 使用函数os.listdir()获取路径下所有的文件列表并赋值给变量allPhotos
allPhotos=os.listdir(photoPath)
# 定义一个空列表变量lowerSubList
# 用来装已经收到照片同学名字的列表,全小写
lowerSubList = []
# 遍历文件列表
for photo in allPhotos:
# TODO 使用os.path.splitext()函数分隔后缀名
# 取第一个元素,也就是姓名的部分赋值给变量name
name=os.path.splitext(photo)[0]
# TODO 将name用lower()函数转成小写添加到列表lowerSubList中
# 需要用到列表的append()函数
lowerSubList.append(name.lower())
# TODO 定义空列表变量notSubList, 用来放没有提交照片用户的名字
notSubList=[]
# 遍历所有学生名字列表
for student in studentList:
# TODO 将名字用lower()转成小写然后判断当不在已经提交的名单时
if student.lower() not in lowerSubList:
# TODO 找到没有提交同学的名字,添加到列表notSubList
notSubList.append(student)
# TODO 输出notSubList,也就是没有交照片同学的名字
print(notSubList)
结果
['James', 'Joan', 'Tracy', 'Jay', 'Faye', 'Dana']