os模块
一·什么是os模块
os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同
的平台进行相应的操作,在python编程时,经常和文件、目录打交道,这时就离不了os模块。
二·常用的os模块命令
第一个:系统操作
os.sep :主要用于系统路径的分隔符(返回当前系统的分隔符):
import os
print(os.sep) # 返回当前系统的分隔符
os.name :指示你正在使用的工作平台。
比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。
print(os.name) # nt
os.getenv(环境变量名称):读取环境变量
print(os.getenv('PATH'))
D:\Anaconda3;D:\Anaconda3\Library\mingw-w64\bin;D:\Anaconda3\Library\usr\bin;D:\Anac
onda3\Library\bin;D:\Anaconda3\Scripts;C:\Program Files (x86)\Common
Files\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\wi
ndows\System32\WindowsPowerShell\v1.0\;C:\windows\System32\OpenSSH\;C:\Program
Files\Java\jdk-11\bin;C:\Program Files\Java\jre1.8.0_291\bin;C:\Program
Files\MySQL\MySQL Server 8.0\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows
Performance Toolkit\;C:\Program Files\MySQL\MySQL Shell
8.0\bin\;C:\Users\Administrator\AppData\Local\Programs\Python\Python310-
32\Scripts\;C:\Users\Administrator\AppData\Local\Programs\Python\Python310-
32\;%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;C:\Program
Files\Bandizip\;%PyCharm Community Edition%;C:\Users\Administrator\AppData\Loca
l\Programs\Python\Python37-32\Scripts\;C:\Users\Administrator\AppData\L
ocal\Programs\Python\Python37-32\;%IntelliJ IDEA Community
Edition%;D:\qqyx\QQGameTempest\Hall.57768\
os.getcwd():获取当前执行文件的路径。
print(os.getcwd())
D:\pythonproject\test
第二个:目录操作-增删改查
os.listdir():返回指定目录下的所有文件和目录名(默认当前执行文件)
print(os.listdir())
['.idea', '1.py', '1.txt', 'a.py', 'b.py', 'day 19 homework(1).py', 'hongniu.py', 'main.py', 'test.py', 'userinfo.txt', '__pycache__']
print(os.listdir(r'C:\\')) # 返回C盘下的所以文件和目录
['$RECYCLE.BIN', '$WinREAgent', 'Boot', 'bootmgr', 'Documents and Settings', 'DumpStack.log.tmp', 'ESAP-Wushi', 'Fraps', 'LeakHotfix', 'pagefile.sys', 'Position', 'Program Files', 'Program Files (x86)', 'ProgramData', 'Recovery', 'swapfile.sys', 'System Volume Information', 'Users', 'Windows', 'wlog.txt']
os.mkdir() :创建一个目录,只创建一个目录文件,不能创建文件如:a.py, a.txt等。
os.mkdir('aaa') #
os.rmdir() :删除—个单级(一层)的空目录。若目录中有文件(甚至是空文件或空文件夹(目录))则无法删除。
os.rmdir('a')
os.makedirs(dirname):可以生成多层递归目录。如果目录全部存在,则创建目录失败。如有部分存在,则创建不存在的文件夹。
os.makedirs(r'ccc') # makedirs可以创建单级目录
os.makedirs(r'bbb/ccc/eee') # makedirs支持创建多级目录
os.removedirs(dirname):可以删除多层递归的空目录,若目录中有文件则无法删除.
os.removedirs(r'ccc') # 可以删除单级目录
os.removedirs(r'bbb/ccc/eee') # 删除目录之后如果外层的目录也是空的则继续删除
os.remove():删除文件
os.remove('bbb/ccc/a.py') # 只能删除文件,不能删除目录
os.chdir():改变当前目录,到指定目录中。(切换路径)
os.chdir('C:\\') # 切换至C盘目录下
print(os.getcwd()) # 查看当前路径C:\
os.rename():重命令名目录名或者文件名。重命名后的文件名在同一路径下已存在时,则重命名失败。
os.rename('1.py', 'a.py')
判断
os.path.exists(path):判断文件或者目录是否存在。存在则返回True,否则返回False
print(os.path.exists(r'C:\\')) # True
os.path.isfile(path):判断是否为文件。是文件则返回True,否则返回False
print(os.path.isfile(r'C:\\')) # False
print(os.path.isfile(r'a.py')) # True
os.path.isdir(path):判断是否为目录。是目录则返回True,否则返回False
print(os.path.isdir('bbb')) # True
print(os.path.isdir('a.py')) # False
path模块
os.path.basename(path):返回文件名;
print(os.path.basename(r'a.py')) # a.py
print(os.path.basename(r'bbb')) # bbb
os.path.dirname(path):返回文件路径;
print(os.path.dirname('ccc'))
os.path.getsize(name)∶获得文件大小(字节 bytes),如果name是目录返回0;
print(os.path.getsize('a.py')) # 11379
print(os.path.getsize('bbb/ccc/aaa')) # 0
os.path.abspath(name):获得绝对路径;
print(os.path.abspath('a.py')) # D:\pythonproject\test\a.py
print(os.path.abspath('bbb')) # D:\pythonproject\test\bbb
os.path.join(path,name):连接目录与文件名或目录(能够自动识别当前操作系统的分隔符)
a = os.path.abspath('bbb')
b = 'ccc'
d = os.path.join(a,b)
print(d) # D:\pythonproject\test\bbb\ccc
软件开发目录规范 启动脚本兼容性操作
os.path.dirname(__file__) # 动态获取当前执行文件所在的绝对路径 D:\pythonproject\test\hongniu.py
os.path.dirname(os.path.dirname(__file__)) # 每嵌套一层就是往上切换一层 D:\pythonproject\test
print(os.path.abspath(__file__)) # 动态获取当前执行文件自身的路径 D:\pythonproject\test\hongniu.py
sys模块
简介
Python的sys模块提供访问由解释器使用或维护的变量的接口,并提供了一些函数用来和解释器进行交互,
操控Python的运行时环境。
sys.argv 传递给程序的命令行参数列表;其中,sys.argv[0]表示脚本名称,各个参数均为字符串类
型。
"""
cmd终端可以使用windows+r并输入cmd唤起
也可以在pycharm直接使用快捷方式Terminal
模拟cmd并自动切换到当前执行文件所在的路径下
"""
if len(sys.argv) == 3: # 这里的判断也可以变成异常捕获的形式
username = sys.argv[1]
password = sys.argv[2]
if username == 'jason' and password == '123':
print('可以正常执行该文件')
else:
print('用户名或密码错误 没有该文件的执行权限')
else:
print('请输入用户名和密码 不能漏写或多写')
sys.path 模块的搜索路径;sys.path[0] 表示当前执行文件所在目录
print(sys.path)
['D:\\pythonproject\\test', 'D:\\pythonproject\\test', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python310-32\\python310.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python310-32\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python310-32\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python310-32', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python310-32\\lib\\site-packages']
print(sys.path[0]) # D:\pythonproject\test
sys.version 获取解释器版本信息
print(sys.version)
3.10.0a1 (tags/v3.10.0a1:8e9afaf, Oct 5 2020, 20:22:20) [MSC v.1927 32 bit (Intel)]
sys.platform 获取平台信息
print(sys.platform) # win32
json模块
简介
JSON是一种独立于语言的文本格式,用于数据交换,可以在不同语言间交换数据。
在高级版本的Python里自带json模块包,使用import json直接导入模块。
JSON文本以“键/值”对形式定义,Python里的json模块主要用于“Python数据与JSON格式的数据间相互转换”。
JSON的数据类型:数字(整数或浮点数),字符串(“ ”),逻辑值(True/False),数组([ ]),对象({ }),null。
json模块里常用的四个方法是dump,dumps,load,loads。详细的方法使用细节参考Python自带帮助文件help(json.dump)。
json格式数据的具体特征
结论1中有一个小细节>>>:数据基于网络传输肯定是二进制格式
在python中bytes类型的数据可以直接看成是二级制数据
python中哪些数据可以转成bytes类型(编码encode())
只有字符串可以!!!
由上述推论可知 json格式数据 本质应该属于字符串类型
方法
(1)Encode编码为json对象
dump的功能就是把Python对象encode为json对象,一个编码过程。 注意json模块提供了json.dumps和
json.dump方法,区别是dump直接到文件,而dumps到一个字符串,这里的s可以理解为string。
json.dumps()
import json
data = {'a': 'A', 'b': (2, 4), 'c': 3.0}
print('DATA:', data, type(data))
DATA: {'a': 'A', 'b': (2, 4), 'c': 3.0} <class 'dict'>
data_string = json.dumps(data)
print('JSON:', data_string, type(data_string))
JSON: {"a": "A", "b": [2, 4], "c": 3.0} <class 'str'>
json.dump()
不仅可以把Python对象编码为string,还可以写入文件。
但是不能把Python对象直接写入文件,这样会报错TypeError: expected a string or other character buffer object,
需要将其序列化之后才可以写入文件。
import json
data = [{'a': 'A', 'b': (2, 4), 'c': 3.0}]
with open('output.json', 'w') as fp:
json.dump(data, fp)
(2)Decode解码为Python对象:
json.loads()
data_string = r'{"a": "A", "b": [2, 4], "c": 3.0}'
print(type(data_string)) # {"a": "A", "b": [2, 4], "c": 3.0} # json格式数据
decoded_json = json.loads(data_string)
print(type(decoded_json), decoded_json) # <class 'dict'> {'a': 'A', 'b': [2, 4], 'c': 3.0}
json.load()
with open('output.json') as fp:
print(type(fp)) # <class '_io.TextIOWrapper'>
loaded_json = json.load(fp)
print(type(loaded_json), loaded_json) # <class 'dict'> {'a': 'A', 'b': [2, 4], 'c': 3.0}
补充
"""
json.dumps() 序列化
将python数据类型转换成json格式字符串
json.loads() 反序列化
将json格式字符串转换成对应的数据类型
"""
"""
如果json模块需要配合文件一起使用的话 有固定的方法
json.dump()
将其他数据类型直接写入文件(自动转json格式字符串)
json.load()
将文件数据直接转成对应的数据类型(自动反序列化)
"""
# 强调:不是所有的数据类型都支持序列化
"""
+-------------------+---------------+
| Python | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
"""
subprocess模块
import subprocess
# ls在终端的意思就是查看当前路径下所有的文件名称
res = subprocess.Popen('ls',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
print('stdout',res.stdout.read().decode('utf8')) # 获取正确命令执行之后的结果
print('stderr',res.stderr.read().decode('utf8')) # 获取错误命令执行之后的结果
"""
该模块可以实现远程操作其他计算机的功能
动态获取命令执行并返回结果
eg:类似于Xshell软件的功能
"""
今日作业(直接复制代码就能运行)
编程题
项目功能
1.用户注册
2.用户登录
3.添加购物车
4.结算购物车
项目说明
用户数据采用json格式存储到文件目录db下 一个用户一个单独的文件
数据格式 {"name":"jason","pwd":123}
ps:文件名可以直接用用户名便于校验
用户注册时给每个用户添加两个默认的键值对(账户余额 购物车)
{"balance":15000,"shop_car":{}}
添加购物车功能 商品列表可以自定义或者采用下列格式
good_list = [
['挂壁面',3]
['印度飞饼', 22]
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
用户可以反复添加商品,在购物车中记录数量
{'极品木瓜':[个数,单价]}
结算购物车
获取用户购物车中所有的商品计算总价并结算即可
思考:针对添加购物车和结算只有登录的用户才可以执行如何实现
import os
import json
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]]
is_login = [0, 'username'] # 标记是否已登入 第一个参数:0:未登入 1:已登入|第二个参数:记住登入后的用户名
# 装饰器:再进行购物车添加和结算是需要先登入
def f1(func):
def f2():
if is_login[0] == 1:
func()
else:
print('------请先登入后再进行操作------')
login()
return f2
# 当db文件不存在时,生成一个db文件夹
def isdb():
if not os.path.isdir('db'):
os.makedirs(r'db')
# 获取用户名和密码并返回
def getInfo():
username = input('请输入你的用户名: ').strip()
password = input('请输入你的密码: ').strip()
return username, password
# 登入
def login():
name, pwd = getInfo()
name_file = name + '.json' # 用于定义文件名 name.json格式
db_path = os.path.abspath('db') # 找到db文件的绝对地址
db_path_file = os.listdir(db_path) # 查找db文件夹下所有的文件,并以列表的形式返回文件名
if name_file in db_path_file: # 判断是否存在 该文件
os.chdir(db_path) # 切换到db目录下
with open(name_file) as f1: # 打开账号对应的json文件,转为原数据类型这里是字典
pwd_json = json.load(f1)
if pwd_json['pwd'] == int(pwd):
print('------登入成功------')
is_login[0] = 1
is_login[1] = name
else:
print('------账号或密码错误------')
os.chdir(os.path.dirname(__file__)) # 切换回执行文件路径
else:
print('------账号不存在------')
# 注册
def register():
name, pwd = getInfo()
name_file = name + '.json' # 用于文件名 name.json格式
db_path = os.path.abspath('db') # 找到db文件的绝对地址
db_path_file = os.listdir(db_path) # 查找db文件夹下所有的文件,并以列表的形式返回文件名
if name_file in db_path_file: # 判断是否存在 该文件
print('------账号已存在------')
else:
user_dict = {
'name': name,
'pwd': int(pwd),
'balance': 15000,
'shop_car': {}
}
os.chdir(db_path) # 切换到db目录下
with open(f'{name_file}', 'w') as f1: # 将数据写入文件
json.dump(user_dict, f1)
print('------注册成功------')
os.chdir(os.path.dirname(__file__)) # 切换回执行文件路径
@f1 # 将商品添加到购物车
def add_to():
name = is_login[1]
name_file = name + '.json' # 用于文件名 name.json格式
db_path = os.path.abspath('db') # 找到db文件的绝对地址
os.chdir(db_path) # 切换到db目录下
with open(name_file) as f1: # 转为原数据类型这里是字典
name_file_dict = json.load(f1)
while True:
print('''
编号 商品名 单价
(1) 挂壁面 3
(2) 印度飞饼 22
(3) 极品木瓜 666
(4) 土耳其土豆 999
(5) 伊拉克拌面 1000
(6) 董卓戏张飞公仔 2000
(7) 仿真玩偶 10000
(8) 退出
''')
list_id = int(input('请输入商品编号: ').strip())
if list_id in [1, 2, 3, 4, 5, 6, 7]:
numb = int(input('请输入需要的个数: ').strip())
name_file_dict['shop_car'][good_list[list_id - 1][0]] = [numb, good_list[list_id - 1][1]] # 将商品添加到购物车
print('-----------------------------')
elif list_id == 8:
break
with open(name_file, 'w') as f2:
json.dump(name_file_dict, f2)
os.chdir(os.path.dirname(__file__)) # 切换回执行文件路径
@f1 # 结算
def settlement():
name = is_login[1]
name_file = name + '.json' # 用于文件名 name.json格式
db_path = os.path.abspath('db') # 找到db文件的绝对地址
os.chdir(db_path) # 切换到db目录下
with open(name_file) as f1: # 转为原数据类型这里是字典
name_file_dict = json.load(f1)
have_money = name_file_dict['balance'] # 获取余额
need_money = 0
for i in name_file_dict['shop_car'].values():
need_money += (i[0] * i[1]) # 计算需要多少钱
if have_money >= need_money:
money = have_money - need_money
name_file_dict['balance'] = money
print(f'------余额:{money}------')
name_file_dict['shop_car'] = {} # 清空购物车
with open(name_file, 'w') as f2:
json.dump(name_file_dict, f2)
os.chdir(os.path.dirname(__file__)) # 切换回执行文件路径
else:
print('------余额不足------')
@f1 # 查看信息
def select_info():
name = is_login[1]
name_file = name + '.json' # 用于文件名 name.json格式
db_path = os.path.abspath('db') # 找到db文件的绝对地址
os.chdir(db_path) # 切换到db目录下
with open(name_file) as f1: # 转为原数据类型这里是字典
name_file_dict = json.load(f1)
print(
f'''
用户名:{name_file_dict['name']}
密码:{name_file_dict['pwd']}
余额:{name_file_dict['balance']}
购物车:{name_file_dict['shop_car']}
'''
)
os.chdir(os.path.dirname(__file__)) # 切换回执行文件路径
def login_out():
if is_login[0] == 1:
is_login[0] = 0
is_login[1] = ''
print('------退出成功------')
else:
print('------请先登入------')
funcs_dict = {
'1': register,
'2': login,
'3': add_to,
'4': settlement,
'5': login_out,
'6': select_info
}
isdb()
while True:
print('''
1.用户注册
2.用户登录
3.添加购物车
4.结算购物车
5.退出登入
6.查看用户信息
7.退出
''')
chioce = input('请输入要进行的指令: ').strip()
if chioce in funcs_dict.keys():
funcs_dict[chioce]()
elif chioce == '7':
break
else:
print('------输入的指令有误------')