常用模块——os模块、sys模块
os模块
os模块是与操作系统交互的一个接口
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.system("bash command") 运行shell命令,直接显示
os.popen("bash command).read() 运行shell命令,获取执行结果
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.path
os.path.abspath(path) 返回path规范化的绝对路径os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
具体使用
1.创建目录(文件夹)
os.mkdir('dirname') 生成单级目录
os.makedirs(r'dirname1\dirname2') 可生成多层递归目录
os.makedirs(r'aaa\bbb\ccc\ddd\eeee') 可生成多层递归目录,可以一直往下创建
os.makedirs(r'aaa') 也可以创建单级目录
2.删除目录(文件夹)
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推。如果不是当前文件需要直接写删除文件的路径
3.列举指定路径下内容名称
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印,什么都不写。会打印当前文件所在的文件夹中的所有文件
res = os.listdir() # 会打印当前文件所在的文件夹中的所有文件名称
print(res) # ['.idea', '01 random模块.py', '02 os模块.py'] # '.idea'是隐藏文件
# os.listdir('路径')
res = os.list('D:\python25\day21\aaa')
print(res) # ['a.txt', 'b.txt', 'c.txt','d.txt','eee'] # 'eee'是文件夹名
'''
————————————————————————————————
用户登录
可以把每个用户存一个用户名.txt文件,用os.listidr,就可以拿到用户名的文件(for循环)
————————————————————————————————
'''
4.删除/重命名文件
os.remove() 删除一个文件,只能删文件
os.rename("oldname","newname") 重命名文件/文件夹
os.stat('path/filename/路径') 获取文件/目录信息,返回一系列信息,有3time时间
os.system("bash command") 运行shell命令,直接显示
os.system('tanklist') 执行一些命令,在文件代码执行的结果与在cmd窗口执行的结果一致
os.popen("bash command").read() 运行shell命令,获取执行结果(后期讲解)
5.获取/切换当前工作目录
os.getcwd() 获取当前文件的路径,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;切换路径;windows中如何切换路径:cmd窗口,写D:\,切换到D盘,cd.python25,切换到D盘下的python25文件夹
os.chdir(r'D:\python25\day21\aaa') # 将当前文件的路径切换到aaa文件下,是文件中的数据直接保存在aaa下,但是文件名称位置不变
print(os.getcwd()) # D:\pythonProject03\day19
os.chdir('..') # 切换到上一级目录
print(os.getcwd()) # D:\pythonProject03
os.mkdir(r'hei') # 以后用文件相对路径的时候,都是以pythonProject03为准
6.动态获取项目根路径(很重要)
os.path.abspath(path) 返回path规范化的绝对路径
os.path.dirname(path) 返回path的上一层路径。其实就是os.path.split(path)的第一个元素
一般两者结合使用,动态获取项目根路径
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
print(os.path.basename(D:\python25\day21\02 os模块.py))
# 02 os模块.py
print(os.path.basename(D:\python25\day21))
# day21
'''切分文件路径方法:
1.os.path.basename(path)
2.split(),得到个列表,[-1]取文件名
'''
# 绝对路径
res=os.path.abspath(__file__)
print(__file__) # __file__不会单独使用,在哪个文件里面写就是那个文件的路径
res1=os.path.dirname(os.path.abspath(__file__)) # 获取执行文件目录路径
res2=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
res3=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
res4=os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
print(res) # D:\python25\day21\02 os模块.py
print(res1) # D:\python25\day21
print(res2) # D:\python25
print(res3) # D:\
print(res4) # D:\ 不会报错,到了根目录再使用还是返回根目录
————————————————————————————————————
动态获取项目根路径(在执行文件中)
import os
import sys
base_dir1 = os.path.dirname(__file__) # bin
base_dir2 = os.path.dirname(os.path.dirname(__file__)) #bin的层
'''一般嵌套两层'''
sys.path.append(base_dir2)
兼容性更强,这样如果别人下载了文件后(无论保在哪里)都可以使用
————————————————————————————————————
7.判断路径是否存在(文件、目录)
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
'''exists既可以判断文件夹也可以判断文件是不是存在'''
os.path.isabs(path) 如果path是绝对路径,返回True
# os.path.isfile()只能判断路径是否是文件
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False。输入的是个文件夹,返回False
# os.path.isdir()只能判断文件夹是不是存在
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
print(os.path.exists(r'01 os模块.py') #判断文件路径是否存在
print(os.path.exists(r'D:\pythonProject03\day19')) #判断目录是否存在
'''
——————————————————————————————
是否要自动化创建目录, 使用
———————————————————————————————
'''
print(os.path.isfile(r'01 os模块.py')) # 判断路径是否是文件 True
print(os.path.isfile(r'D:\pythonProject03\day19')) # 判断路径是否是文件 False
print(os.path.isdir(r'01 os模块.py')) # False
print(os.path.isdir(r'D:\pythonProject03\day19')) # True
8.路径拼接(重要)
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
file_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
res=os.path.join(file_path, 'qq.txt')
print(res)
# 输出结果是:D:\python25\qq.txt
这样写不需要管斜杠的方向
res1=os.path.join(file_path, 'aaa', 'bbb', 'ccc', 'qq.txt') 会自动识别分隔符
print(res1) # D:\python25\aaa\bbb\ccc\qq.txt
"""
涉及到路径拼接一定不要自己做 因为不同的操作系统路径分隔符不一样
"""
9.获取文件大小(字节)
os.path.getsize('a.txt') #helloworld
# 输出结果是:10
os.path.getsize('a.txt') #helloworld你好啊
# 输出结果是:19
os.path.getsize('a.txt')
# 输出结果是:0
'''空文件返回的是0,可以根据os.path.getsize(path)来判断文件是否为空'''
10.拓展
os.walk()
注意:os.stat('path/filename') 获取文件/目录信息 的结构说明
stat 结构:
st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
os模块属性
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
sys模块
sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
异常处理
import sys
try:
sys.exit(1)
except SystemExit as e:
print(e)
使用
1.sys.argv
(**掌握)命令行参数List,第一个元素是程序本身路径
import sys
print(sys.argv)
# 输出结果是:['D:/python25/day21/03 sys模块.py'] # 当前文件的路径
'''
执行文件的方式:
1.cmd窗口输入python36, 进入python解释器环境中,输入代码
2.代码放入文件中,cmd窗口输入python36 文件名
(快速进入cmd窗口:找到文件位置,在上面路径框中直接输入cmd,回车)
**********
D:\es>python36 b.txt 回车, 就会执行b.txt文件中的代码
***********
3.PyCharm中输入代码
'''
上述第二种方式在pycharm中也可以实行:
pycharm中的Terminal (控制台)——————>就是cmd窗口
里面的功能与cmd一样
优点:进入后就路径就直接切换好了,就在当前文件的路径下
【cmd默认是C盘,想要执行解释器,就需要先切换到解释器所在位置的盘中】
————————————————
03 文件中:
print(sys.argv)
Terminal:
python36 "03 sys模块.py"
# 输出结果是:['03 sys模块.py']
————————————————————
'''传参数'''可以直接传参数给argv
03 文件中:
print(sys.argv)
Terminal:
python36 "03 sys模块.py" 111 222 333
# 输出结果是:['03 sys模块.py','111', '222', '333']
——————————————————————
'''取参数'''
03 文件中:
print(sys.argv)
print(sys.argv[1])
print(sys.argv[2])
print(sys.argv[3])
Terminal:
python36 "03 sys模块.py" 111 222 333
# 输出结果是:
# > ['03 sys模块.py','111', '222', '333'] # > 111
# > 222
# > 333
后面使用mysql,可以直接使用上述方式,外部传参。输入用户名和密码
————————————————————————————
'''判断用户名和密码'''
03 文件中:
try:
username = sys.argv[1]
password = sys.argv[2]
if username == 'kevin' and password == '123':
print('输入正确')
else:
print('输入错误')
except Exception:
print('')
Terminal: 1
python36 "03 sys模块.py" root 123
# 输出结果是:
# > ['03 sys模块.py','root', '123']
# > 输入错误
Terminal: 2
python36 "03 sys模块.py" kevin 123
# 输出结果是:
# > ['03 sys模块.py','kevin', '123']
# > 输入正确
Terminal: 3
# 如果不传参数会报错,所以直接捕捉异常,这样输入参数也可以运行,不输入参数也可以运行
python36 "03 sys模块.py"
# 输出结果是:
# > ['03 sys模块.py']
2.sys.version 获取Python解释程序的版本信息
import sys
print(sys.version)
# 输出结果是:3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)]
3.sys.platform 查看系统版本
import sys
print(sys.platform)
# 输出结果是:win32 # 表示windows系统
if sys.platform == 'win32':
print('Windows系统')
else:
print('其他系统')
通过属性获取数据,不需要加括号
通过方法获取数据,需要加括号