常用模块——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('其他系统')

通过属性获取数据,不需要加括号
通过方法获取数据,需要加括号

posted @ 2023-03-13 20:37  星空看海  阅读(77)  评论(0编辑  收藏  举报