os模块,sys模块,json模块,subprocess模块

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('------输入的指令有误------')

posted @ 2022-03-30 21:20  春游去动物园  阅读(140)  评论(0编辑  收藏  举报