python-模块(三)

random 模块

  • random()

    import random
    print(random.random())  # 随机产生一个0-1之间的小数
    
  • randint()

    import random
    print(random.radint(1, 6))  # 随机产生一个1-6之间的整数
    
  • uniform()

    import random
    print(random.uniform(1, 6)) # 随机产生一个1-6之间的小数
    
  • choice()

    import random
    print(random.choice(['一等奖', '二等奖', '三等奖', '谢谢惠顾']))  # 随机抽取其中一个
    
  • sample()

    import random
    print(random.sample(['安徽省', '江苏省', '山东省', '广东省'],2))  # 随机出去指定样本数量
    
  • shuffle()

    import random
    l = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
    random.shuffle(l)  # 随机打乱容器类型中的元素
    print(l)
    
  • randrange()

    import random
    print(random.randrange(1, 10, 2))  # 随机产生1到10之间的奇数,2 步长
    
  • 验证码生成

    def get_code(n):
      # 提前定义一个存储验证码的变量
      code = ''
      # 由于需要产生五位 每一位的操作都是一样的 所以肯定需要使用循环
      for i in range(n):
          # 随机产生一个数字
          random_int = str(random.randint(0, 9))
          # 随机产生一个大写字母
          random_upper = chr(random.randint(65, 90))
          # 随机产生一个小写字母
          random_lower = chr(random.randint(97, 122))
          # 随机选取一个
          temp = random.choice([random_int, random_upper, random_lower])
          # 拼接到字符串中
          code += temp
      return code
    code1 = get_code(5)
    code2 = get_code(10)
    code3 = get_code(8)
    print(code1,code2,code3)
    

os 模块

  • mkdir()

    import os
    os.mkdir('test')  # 只能创建单级目录
    
  • makedirs()

    import os
    os.makesdirs('test/tes1')  # 创建test目录和下级目录test1(当前斜线表示Linux系统内)
    # 和 linux命令 mkdir -p test/test1 结果一样
    
  • rmdir()

    import os
    os.rmdir('test')  # 只能删除空目录,否则会报错
    
  • 获取当前文件所在路径

    import os
    path = os.path.dirname(__file__)
    print(path)
    
  • 路劲拼接

    import os
    path = os.path.dirname(__file__)
    db_path = os.path.join(path, 'db')
    print(db_path)  # 返回当前路径加db
    
  • listdir()

    # 列举出指定路径下的文件名称(任意类型文件) 返回的是一个列表
    # 相当于Linux命令的 ls
    import os
    print(os.listdir())
    print(os.listdir('/tmp'))
    
  • remove()

    import os
    os.remove('a.txt')  # 删除当前a.txt
    # 删除文件不能是目录  相当于 rm -f
    
  • rename()

    import os
    os.rename('a.txt', 'b.txt')  # 将a.txt 改名为 b.txt
    os.rename('test', 'test1')  # 将test目录改为test1目录
    # 可以改文件或者目录名字 类似Linux命令的 mv
    
  • getcwd()

    import os
    print(os.getcwd())  # 获取当前工作路径  Linux --> pwd
    
  • chdir()

    import os
    os.chdir('/mnt')  # 切换工作路径到/mnt目录  Linux --> cd
    
  • exists()

    # 判断目录或者文件是否存在 存在返回Treu 不存在返回False
    import os
    print(os.path.exists('/tmp'))  # 存在目录/tmp返回True 不存在返回False
    print(os.path.exists('/tmp/test.txt'))  # 存在文件test.txt 返回True 不存在返回False
    print(os.path.exists('/tmp/test'))  # 存在目录/tmp/test返回True 不存在返回False
    
  • isfile()

    # 判断是否是文件,是文件返回True,是目录返回False
    import os
    print(os.path.isfile('/tmp/test.txt'))  # True
    print(os.path.isfile('/tmp/'))  # Fales
    
  • isdir()

    # 判断是否是目录,是目录返回True,是文件返回False
    print(os.path.exists('/tmp/test.txt'))  # False
    print(os.path.isfile('/tmp/'))  # True
    
  • getsize()

    # 获取文件大小(字节数)
    print(os.path.getsize(r'a.txt'))
    
  • 获取目录文件内的文件并按选择读取

    basic_path = os.path.dirname(__file__)  # 获取当前文件的路径
    log_path = os.path.join(basic_path, 'test1')  # 拼接路径,得到 当前路径/test1
    file_list = os.listdir(log_path)  # 得到 test1路径下的文件列表
    
    while True:
        for i, j in enumerate(file_list,1):  # 1 file_list[0], 2 file_list[1], 3 file_list[2]
            print(i,j)
        choice = input('请输入想查看的日志: ').strip()
        if choice.isdigit():
            choice = int(choice)
            if choice in range(len(file_list) + 1):  # range顾头不顾尾所以 加一
                file_name = file_list[choice - 1]  # choice是从1开始的,所以取列表索引时需要 减一
                file_path = os.path.join(log_path,file_name)  # 拼接选择的文件绝对路径
                with open(file_path, 'r', encoding='utf8') as f:
                    print(f.read())  # 打印文件内容
    

sys 模块

import sys

print(sys.path)  # 搜索模块的路径集
print(sys.version)  # 返回python解释器版本以及所处的平台
print(sys.platform)  # 返回当前操作系统类型

print(sys.argv)  # 获取当前执行文件的绝对路径

# sys.argv 第二种用法,类似shell脚本的外部传参
try:
    username = sys.argv[1]  # 相当于shell脚本中 $1
    password = sys.argv[2]  # 相当于shell脚本中 $2
    if username == 'jason' and password == '123':
        print('正常执行文件内容')
    else:
        print('用户名或密码错误')
except Exception:
    print('请输入用户名和密码')
    print('目前只能让你体验一下(游客模式)')


sys.exit(1)  #  执行python执行脚本后抛出的异常信息默认为0,在shell中可以使用  echo $?  命令可以捕获到 一般认为0是正常执行,如果抛出其他数值则出现异常,如果python脚本中找到确切的数字就可以找到指定位置

序列化模块

json 格式化数据: 跨语言传输

import json

d = {'username': 'jason', 'pwd': 123}
print(d,type(d))  # {'username': 'jason', 'pwd': 123} <class 'dict'>

# 将字典转为json格式的字符串(序列化), 此时是 str 类型, 但是是json的格式
res1 = json.dumps(d)
print(res1, type(res1))  # {"username": "jason", "pwd": 123} <class 'str'>

# 将json格式字符串转成当前语言对应的某个数据类型(反序列化)
res2 = json.loads(res1)
print(res2, type(res2))  # {'username': 'jason', 'pwd': 123} <class 'dict'>

# bytes的
bytes_data = b'{"username": "jason", "pwd": 123}'
bytes_str = bytes_data.decode('utf8')
bytes_dict = json.loads(bytes_str)
print(bytes_dict, type(bytes_dict))  # {'username': 'jason', 'pwd': 123} <class 'dict'>

# 将字典以json格式写入文件(序列化)
with open(r'a.json', 'w', encoding='utf8') as f:
    f.write(json.dumps(d))

# 将字典取出来(反序列化)
with open(r'a.json', 'r', encoding='utf8') as f:
    data = f.read()
res = json.loads(data)
print(res, type(res))  # {'username': 'jason', 'pwd': 123} <class 'dict'>

# 不用write 可以使用dump直接将 字典d 以json格式写入文件(序列化)
with open(r'b.json', 'w', encoding='utf8') as f:
    json.dump(d, f)

# 不用read 使用load 将字典d 从文件中去出来,直接转为字典(反序列化)
with open(r'b.json', 'r', encoding='utf8') as f:
    rest = json.load(f)
print(rest, type(rest))  # {'username': 'jason', 'pwd': 123} <class 'dict'>

"""
暂且可以简单的理解为
    序列化就是将其他数据类型转换成字符串过程
        json.dumps()
    反序列化就是将字符串转换成其他数据类型
        json.loads()
"""

subprocess 模块

res = subprocess.Popen('ps -ef',  # 在终端运行的命令
                       shell=True,  # 新开一个端口
                       stdout=subprocess.PIPE,  # 执行完命令, 将正确输出放到一个管道里
                       stderr=subprocess.PIPE  # 将错误输出放到一个管道里
                       )
print('stdout',res.stdout.read().decode('utf8'))  # 获取正确命令执行之后的结果
print('stderr',res.stderr.read().decode('utf8'))  # 获取错误命令执行之后的结果