一、目录遍历
os 用于获取系统的功能,主要用于操作文件或者文件夹
代码演示:
import os path = r"C:\Users\Administrator\Desktop\SZ-Python" #获取指定目录下所有的文件以及文件夹,返回值为一个列表 filesList = os.listdir(path) print(filesList) #C:\Users\Administrator\Desktop\SZ-Python #通过初始路径拼接子文件或者子文件夹形成新的路径 filePath = os.path.join(path,"作业") print(filePath) #判断指定的路径是否是文件夹【目录】 result = os.path.isdir(filePath) print(result)
1.使用递归遍历目录
代码演示:
#1.递归 import os def getAll(path): #1.获取当前目录下所有的文件以及文件夹 fileList = os.listdir(path) print(fileList) #2.遍历列表 for i in fileList: #3.拼接路径 filePath = os.path.join(path,i) #4.判断filePath是否是文件夹 if os.path.isdir(filePath): #文件夹:递归 getAll(filePath) else: #文件 print("文件:",i) getAll(r"C:\Users\Administrator\Desktop\SZ-Python")
2.栈模拟递归遍历目录
深度遍历
代码演示:
#栈 #append pop import os def getAll(path): #初始状态下,栈是空的 stack = [] #将初始路径添加到栈中 stack.append(path) #处理栈,当栈为空的时候说明其中的内容为空,循环停止 while len(stack) != 0: #从栈中取出数据 dirPath = stack.pop() #获取指定路径下的所有的文件以及文件夹 filesList = os.listdir(dirPath) #遍历列表‘ for fileName in filesList: filePath = os.path.join(dirPath,fileName) if os.path.isdir(filePath): print("文件夹;",fileName) #如果是目录,将路径添加到栈中 stack.append(filePath) print(stack) else: print("文件:",fileName) getAll(r"C:\Users\Administrator\Desktop\SZ-Python")
3.队列模拟递归遍历目录
广度遍历
代码演示:
#栈 #append popleft import os import collections def getAll(path): #初始状态下,队列是空的 queue = collections.deque() #将初始路径添加到队列中 queue.append(path) #处理栈,当栈为空的时候说明其中的内容为空,循环停止 while len(queue) != 0: #从栈中取出数据 dirPath = queue.popleft() #获取指定路径下的所有的文件以及文件夹 filesList = os.listdir(dirPath) #遍历列表‘ for fileName in filesList: #拼接路径 filePath = os.path.join(dirPath,fileName) if os.path.isdir(filePath): print("文件夹;",fileName) #如果是目录,将路径添加到队列中 queue.append(filePath) else: print("文件:",fileName) getAll(r"C:\Users\Administrator\Desktop\SZ-Python")
二、包
包:初期理解为文件夹 作用:一种管理Python模块命名空间的形式,采用"点语法" os.path 包和文件夹之间的区别:Python的包中有一个特殊的文件__init__.py文件,前期里面不写任何内容,但是,就是为了告诉编译器,当前这个目录不是普通目录,是一个包 创建方式:选中工程,创建Python package
代码演示:
""" 1.在Python中,一个py文件其实就是一个模块 2.如果要跨模块调用函数,需要在运行的模块中导入需要使用的模块,调用函数的时候需要指明函数的路径 """ #第一步:导入模块 #导入格式:包名.模块名 import aaa.textDemo01 import ccc.module #os.path.isdir() aaa.textDemo01.test() ccc.module.test() #包存在的意义:在团队开发的过程中,为了解决文件命名冲突的问题,只要保证最上层的包命名不相同,就不会与别人的发生冲突
三、模块
1.概述
为了解决维护问题,一般情况下,在一个完整的项目中,会将特定的功能分组,分别放到不同的文件中,在使用的过程中,可以单独维护,各个不同的文件之间互不影响,每个.py文件就被称为一个模块,通过结合包的使用来组织文件
优点:
a.提高了代码的可维护性
b.提高了代码的复用性【当一个模块被完成之后,可以在多个文件中使用】
c.引用其他的模块【第三方模块】
d.避免函数名和变量的命名冲突
2.系统模块
UTC:格林威治天文时间,UTC+8
时间戳:指定时间距离1970.1.1 00:00:00的秒数
time:时间
datetime:日期
calendar:万年历
os:系统,文件和文件夹
2.1time时间模块
时间的表示形式:
a.时间戳: 如:1523158416.681
b.元组格式
tm_year: 年 tm_mon: 月(1~12) tm_mday:天(1~31) tm_hour:时(0~23) tm_min:分(0~59) tm_sec:秒(0~59) tm_wday: 一周中的第几天(0~6,0表示星期一) tm_yday:一年中的第几天(1~366) tm_isdst:是否是夏令时
c.时间字符串:如:2019-09-08 11:11:11
%y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(01-12) %M 分钟数(00-59) %S 秒(00-59) %a 本地简化星期名称 %A 本地完整星期名称 %b 本地简化的月份名称 %B 本地完整的月份名称 %c 本地相应的日期表示和时间表示 %j 年内的一天(001-366) %p 本地A.M.或P.M.的等价符 %U 一年中的星期数(00-53)星期天为星期的开始 %w 星期(0-6),星期天为星期的开始 %W 一年中的星期数(00-53)星期一为星期的开始 %x 本地相应的日期表示 %X 本地相应的时间表示 %% %号本身
代码演示:
#导入 import time #1。获取当前时间对应的时间戳,使用浮点型表示【掌握】 t1 = time.time() print(t1) #2。将时间戳转换为UTC g = time.gmtime(t1) print(g) #time.struct_time(tm_year=2018, tm_mon=5, tm_mday=29, tm_hour=2, tm_min=29, tm_sec=1, tm_wday=1, tm_yday=149, tm_isdst=0) #3.根据时间戳生成当地时间【掌握】 l = time.localtime(t1) print(l) #4.将具体时间转换为时间戳【掌握】 m = time.mktime(l) print(m) #5.将时间转换为字符串形式【掌握】 a = time.asctime(l) print(a) #Tue May 29 10:36:57 2018 #6.将时间戳转换为字符串形式 c = time.ctime(t1) print(c) #7.将时间进行格式化【指定字符串的格式】【掌握】 """ %Y:年 %m:月 %d:日 %H:时【24小时制】 %h:时【12小时制】 %M:分 %S:秒 """ s1 = time.strftime("%Y.%m.%d %H:%M:%S",l) #string format print(s1) #8.休眠,参数的单位为秒【掌握】 print("4674747") time.sleep(2) print("hello") #9.用浮点数【一般用科学计数法】计算的秒数返回当前cpu的时间,用于衡量不同程序的耗时 print(time.clock()) #廖雪峰的网站 菜鸟教程
练习:
#需求;已知一个时间的字符串,然后输出三天之后的时间 """ 思路: 1.将已知的字符串转换为对应的时间戳 2.利用时间戳计算三天后的时间【加法运算 + 3 * 24 * 3600】 3.将时间戳转换为时间的字符串,并且将时间格式化 """ import time str = "2017-5-20" #1.将已知的字符串转换为对应的时间戳 newStr = time.strptime(str,"%Y-%m-%d") print(newStr) time1 = time.mktime(newStr) print(time1) #2.利用时间戳计算三天后的时间【加法运算 + 3 * 24 * 3600】 time2 = time1 + 3 * 24 * 3600 #3.将时间戳转换为时间的字符串,并且将时间格式化 time3 = time.strftime("%Y-%m-%d",time.localtime(time2)) print(time3) #2017-05-23
2.2datetime日期模块
是对time模块的封装,比time模块更加全面
dt_now = datetime.datetime.now() 获取当前的日期对象,包含时间的 dt_ziding = datetime.datetime() 根据指定的日期、时间生成一个日期对象 dt.strftime() 将日期对象转化为指定的格式 dt.date() 获取日期对象中的日期 dt.time() 获取日期对象中的时间 dt.timestamp() 获取日期对象的时间戳 dt.hour\minute\second 获取小时、分钟、秒 datetime.datetime.fromtimestamp() 根据一个时间戳,转化为指定的日期对象 datetime.timedelta() 生成一个差值对象,可以和日期对象直接进行相加减 参数有,days,hours,minutes,seconds
代码演示:
import datetime #1.获取当前时间 d1 = datetime.datetime.now() print(d1) #2018-05-29 11:20:51.432757 #2.获取指定的时间,通过元组形式 d2 = datetime.datetime(2015,10,1,10,23,23,1234) print(d2) #3.将时间格式化 d3 = d1.strftime("%Y.%m.%d") print(d3) #4.将时间字符串转换为datetime实体 d4 = datetime.datetime.strptime(d3,"%Y.%m.%d") print(d4) #5.直接进行加减运算 date1 = datetime.datetime(2015,10,1,10,23,23,0) print(date1) date2 = datetime.datetime(2015,10,4,10,23,23,0) date3 = date2 - date1 print(date3) #3 days, 0:00:00 print(date3.days) print(date3.seconds)
2.3calendar日历模块
calendar(year,w=2,l=1,c=6) 打印某一年的日历【c间隔距离; w每日宽度间隔; l是每星期行数 】 isleap(year) 判断是否是闰年 leapdays(y1, y2) [y1, y2) 中间闰年的个数 month(year,month,w=2,l=1) 打印指定月份的日历 monthcalendar(year,month) 返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。 Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。 monthrange(year,month) 返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。 日从0(星期一)到6(星期日);月从1到12。
代码演示:
import calendar #返回指定年份中指定月份的万年历表示 print(calendar.month(2018,5)) #返回指定年份的万年历表示 print(calendar.calendar(2018)) #返回一个列表【二维列表】 print(calendar.monthcalendar(2018,5)) #当前周起始的日期 print(calendar.firstweekday()) #判断某年是否为闰年 print(calendar.isleap(2010)) #统计两个年份之间闰年的总数 print(calendar.leapdays(2000,2020)) #获取的是星期,0【星期一】~6【星期天】 1~12 print(calendar.weekday(2018,5,29))
2.4os模块
提供有关于操作系统的函数,处理文件或者文件夹
代码演示:
import os #1.获取当前操作系统的名称 #nt----->Windows posix------>Linux,Mac os print(os.name) #2.获取当前系统的环境变量 #以字典的形式返回 print(os.environ) #通过key获取对应的value print(os.environ.get("APPDATA")) #3,获取指定目录下所有的文件或者文件夹的列表 l = os.listdir(r"C:\Users\Administrator\Desktop\SZ-Python") print(l) #4.在指定的路径下创建文件夹 #os.mkdir(r"C:\Users\Administrator\Desktop\aaa") #5.删除文件夹 #os.rmdir(r"C:\Users\Administrator\Desktop\aaa") #删除文件 #os.remove("") #6.获取文件属性 #print(os.stat(r"C:\Users\Administrator\Desktop\aaa")) #7.给文件或者文件夹重命名 #注意:当前的文件在关闭状态 #rename(old,new) #os.rename(r"C:\Users\Administrator\Desktop\aaa",r"C:\Users\Administrator\Desktop\abc") #os.path模块下 #1.路径的拼接 path = os.path.join(r"C:\Users\Administrator\Desktop\SZ-Python","Day1Code") print(path) #2.绝对路径和相对路径【掌握】 """ 绝对路径:带有盘符的路径,缺点:只能在指定的计算机上使用 相对路径:不带盘符的路径,一般情况下是以当前的工程为参照物 例如: aaa/textDemo01.py ccc/module.py """ #os.rename("bbb/check.py","bbb/show.py") #3.拆分路径 #注意:返回的结果为元组,默认情况下只会拆分最后的文件或者文件夹 tuple1 = os.path.split(r"C:\Users\Administrator\Desktop\SZ-Python\Day1Code") print(tuple) #4.拆分路径,获取指定路径对应的文件的扩展名 print(os.path.splitext(r"C:\Users\Administrator\Desktop\SZ-Python\Day2Code\assignDemo.py")) #5.判断指定路径是否是文件夹 print(os.path.isdir("aaa/textDemo01.py")) #6.判断指定路径是否是文件 print(os.path.isfile("aaa/textDemo01.py")) #7.判断一个指定路径是否存在 print(os.path.exists("aaa/textDemo01.py")) #8.获取文件的大小【字节】 print(os.path.getsize("aaa/textDemo01.py")) #9. #获取指定文件夹的父路径 print(os.path.dirname(r"C:\Users\Administrator\Desktop\SZ-Python\Day1Code")) #获取当前文件夹的名称 print(os.path.basename(r"C:\Users\Administrator\Desktop\SZ-Python\Day1Code"))
练习:
import os #练习:获取指定目录下所有的py文件或者txt文件 """ 思路: 1.判断指定的目录是否存在 2.获取指定目录下所有的文件以及文件夹 3.拼接路径 4.判断拼接之后的路径是否是文件 5.判断文件名称的后缀 """ def getFile(path): #1. if os.path.exists(path): #2 fileList = os.listdir(path) #3. for fileName in fileList: filePath = os.path.join(path,fileName) #4 if os.path.isfile(filePath): #5 if fileName.endswith("py") or fileName.endswith("txt"): print(fileName) else: print(fileName,"不是文件") else: print("指定的路径不存在") getFile(r"C:\Users\Administrator\Desktop\SZ-Python\Day5Code")
3.自定义模块【掌握】
3.1自定义import模块
代码演示:
#1.格式:import 包1.包2.模块的名称 #注意1:通过点语法区分包的层级关系 #引入模块 #注意2:如果要同时导入多个模块,有两种方式 #方式一 """ import os import datetime import math """ #方式二 import os,math,datetime #注意3:当导入自定义模块的时候,需要注意包的存在 #注意5:当通过import将模块导入的时候,将模块对应的文件整个加载了一遍 import ccc.module import moduleTextDemo01 print("***************") #注意4:当模块有包的层级关系时,需要调用其中函数的时候,需要指明函数的路径 ccc.module.test() #os.path.isdir() moduleTextDemo01.fun1() moduleTextDemo01.fun2() moduleTextDemo01.fun3() print(moduleTextDemo01.num)
3.2自定义from-import模块
代码演示:
#form 模块名 import 函数名1/类名,函数名2.。。。 #import moduleTextDemo01 from moduleTextDemo01 import fun1,fun2,fun3 #注意:采用了form。。。import的方式导入指定的函数之后,可以直接调用函数 fun1() fun2() fun3() #好处:进行局部的导入,避免内存空间的浪费 #注意:当前文件中如果存在和模块中同名的函数的时候,当前文件中的函数仍然会将模块中的函数给覆盖掉 def fun1(): print("hello") fun1()
3.3自定义from-import*模块
代码演示:
#from 。。。。 import * *代表全部 """ 下面三种导入方式完全等价:将moduleTextDemo01模块中的所有的内容全部导入 from moduleTextDemo01 import * import moduleTextDemo01 from moduleTextDemo01 import fun1,fun2,fun3 """ from moduleTextDemo01 import * fun1()
总结:在python中,每个py文件其实都是一个模块,如果跨模块调用函数,则采用导入的方式
将不同的功能进行划分,调用函数的时候相对比较方便的
4.name属性和dir函数
4.1name属性
#__name__的作用:如果不想让模块中的某些代码执行,可以通过属性仅仅调用程序中的一部分功能 #【写在if判断中的代码只有当前模块被执行的时候才会被执行,检测到是其他的文件在使用当前的模块,则if语句中的代码不会被执行】 def fun1(): print("aaa") def fun2(): print("bbb") def fun3(): print("ccc") #作用:写在下面判断中的代码,只有当前模块运行的时候才会被执行【起到屏蔽的作用】 if __name__ == "__main__": fun1() fun2() fun3()
4.2dir函数
代码演示:
#dir: import math,moduleTextDemo01 #获取指定模块里面的所有的内容 #dir(模块名称) 返回的是一个列表 print(dir(math)) print(dir(moduleTextDemo01))