常用模块升级

  一、collection 模块

  二、time 模块

  三、random 模块

  四、os 和sys mo模块

  五、系列化与反序列化 json 模块

  六、subprocess 模块

  一、collection 模块

  1.1 namedtuple(具名分组)

# 1.可以表示坐标二维和三维
# from collections import namedtuple
#
# point = namedtuple('坐标',['x','y','z'])  # 第一个为字段名 第二个参数为可以迭代对象
#
# p = point(1,2,4)
# print(p)  # 坐标(x=1, y=2, z=4)


# 2.洗牌
# from collections import namedtuple
# t = namedtuple('扑克牌',' color num')
# t1 = t('黑桃','A')
# print(t1.color)
# print(t1.num)
# l = [90,1,2,9,4,5,8,23,42,5,6]
# import random
# random.shuffle(l)
# print(l)

#
# # 对应的人物
# r = namedtuple('日本','name person size')
# r1 = r('东京','宫崎骏','m')
# print(r1)
# 2.queue(队列:)与deque()双端队列
# 2.queue(队列)
# 队列:先进先出
# l = [12,22,33,44]
# import queue
# # 先生成一个对象
# q = queue.Queue()
# # 往队列里面添加值
# q.put('1')
# q.put('2')
# q.put('3')
# q.put('4')

# 朝队列要值
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get()) # 没有值了get()会一直等待用户传值,直到等到为止

# deque双端队列:所谓的双端队列就是两边都可以进出
# from collections import deque
# q = deque(['a','b','c'])  # deque外层是小括号
# q.append(1)
# q.append(2)
# q.appe nd(3)
# print(q)  # ['a', 'b', 'c', 1, 2, 3] 一次重尾部添加

# appendlef()
# q.appendleft(2)
# print(q,type(q))  #
# q.popleft()
# q.popleft(1)  # popleft()删除元素不用传参
# print(q)

  

# 3.orderedDict(有序字典)
# 和正常字典做对比
# from collections import OrderedDict
# normal_dic = {'name':'coc','age':18}
# order_d = OrderedDict([('a',1),('b',2),('b',3)])
# print(order_d,type(order_d))
# order_d['x'] = 1
# order_d['y'] = 2
# order_d['z'] = 3
# for i in order_d:
#     print(i)

  


# 4.defaultDict(默认字典)
values = [11, 22, 33,44,55,66,77,88,99,90]
# 将大于66的值添加到字典中不要先将value 设为空列表
# 之前的用法为
# 方法一:
# dic = {'k1':[],"k2":[]}
# for i in values:
#     if i >66:
#         dic['k1'].append(i)
#     else:
#         dic['k2'].append(i)
# print(dic)

# 方法二:
# 不能设置默认的[]列表了,怎么做:.>>巧了刚好有个defaultDict()
# (默认是你输入什么类型就是什么类型)后续该字典中新建的Key对应的values默认就是列表
# from collections import defaultdict
#
# my_dic = defaultdict(list)
# # print(my_dic[''])  # []
# # print(my_dic['yyy'])  # []
# for i in values:
#     if i>66:
#         my_dic['k1'].append(i)
#     else:
#         my_dic['k2'].append(i)
# print(my_dic)
#

  

# 5.Counter(字符串计数器):可以直接以字典的形式


# 统计字符串中出现的个数并且以字点的个数作为value

s = 'qwwwqqqeee'
# 方法一:
# dic = {}
# for i in s:
#     if i in dic:
#         dic[i] +=1
#
#     else:
#         dic[i] =1
# print(dic)
# 方法二:
from collections import Counter
l = dict(Counter(s))  # 可以直接转
print(l)
#
dic = {}
for i in l.items():  # 内部原理
    dic[i[0]] = i[1]
print(dic)
二、时间模块
  
"""
三种表现形式
1.时间戳
2.格式化时间(用来展示给人看的)
3.结构化时间
"""
# 字符串的转换
# import time
# res = time.strftime('%Y-%m-%d %X')  # 2019-07-18 20:39:43
# print(res)  # 2019-07-18 20:33:37
#

# datetime

# import datetime
#
# res1 = datetime.date.today()  # 2019-07-18
# res2 = datetime.datetime.today()  # 2019-07-18 20:39:43.402935
#
#
# print(res1)
# print(res2)
# print(res2.isoweekday())  # 4 周四
# print(res1.month,res1.year,res1.day)  #7 七月: 2019 年: day:18

# UTC时间 标准时间
import datetime
day_t = datetime.datetime.utcnow()
print(day_t)  # 2019-07-18 12:42:59.687143 东八区

  三、random模块


"""
大写字母 小写字母 数字

5位数的随机验证码
chr
random.choice
封装成一个函数,用户想生成几位就生成几位
"""

ef get_code(n):
    code = ''
    for i in range(n):
        # 先生成随机的大写字母 小写字母 数字
        upper_str = chr(random.randint(65,90))
        lower_str = chr(random.randint(97,122))
        random_int = str(random.randint(0,9))
        # 从上面三个中随机选择一个作为随机验证码的某一位
        # random.choice() 是一个方法
        code += random.choice([upper_str,lower_str,random_int])
    return code
res = get_code(4)
print(res)

  四、os和sys 模块

# os模块:跟操作系统打交道的模块
# sys模块:跟python解释器打交道
  4.1os 中常用的方法:
# # 可以通过listdir()拿到文件下的所有文件
import os
# os.mkdir('明日内容')  # 创建文件夹
# 2.os.exists()
# print(os.path.exists('D:datasday16今日作品coco.txt'))  # 判断文件/文件夹是否存在

# 3.os.isfile()
# print(os.path.isdir('D:datasday16今日作品'))  # 判断文件夹是否存在

# 4.
# os.getcwd()
print(os.getcwd())  # D:datasday16 查看当前文件运行的文件目录路径

print(os.chdir('D:datasday16今日作品'))
print(os.getcwd())  # D:datasday16今日作品 切换当前的文件目录
print(os.path.getsize('D:datasday16今日作品coco.txt'))  # 字节数

  实列:

# os 中常用的方法:
# 需求打开文件的内容(下载电影):
# 拼接文件的路径:
# import os
# BASE_DIR = os.path.dirname(__file__)  # 当前所在是os模块层只要上一级
# # 项目所在文件夹路径:
# MOVIE_LIST_DIR = os.path.join(BASE_DIR,'今日作品')  # 拼接仅仅只能到到当前的电影目录,没有文件名
#
# # 可以通过listdir()拿到文件下的所有文件
# movie_list = os.listdir(MOVIE_LIST_DIR)  #

# for index,movie in enumerate(movie_list,1):

#     print(index, movie)
# choice = input('输入电影索引(今日推荐tank热搜)>>>:').strip()
# if choice.isdigit():
#     choice = int(choice)
#     if choice in range(1,len(movie_list)+1):
#         # 想要获取用户的文件名
#         target_name = movie_list[choice-1]  # 取索引
#
#         # 拼接文件的绝对路径
#         target_name_path = os.path.join(MOVIE_LIST_DIR,target_name)
#         # 打开文件
#         with open(target_name_path,'r',encoding='utf-8')as f:
#             for line in f:
#                 print(line)

  4.2 sys模块

# sys.path.append()  # 将环境变量添加到系统的环境变量中

print(sys.version) # 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]

print(sys.argv) # 命令行启动文件 可以做身份的验证
if len(sys.argv) <= 1:
print('请输入用户名和密码')
else:
username = sys.argv[1]
password = sys.argv[2]
if username == 'jason' and password == '123':
print('欢迎使用')
# 当前这个py文件逻辑代码
else:
print('用户不存在 无法执行当前文件')

  五、json模块:

  序列化与反序列化:

  5.1  什么是序列化: 

  序列化
  序列:字符串
  序列化:其他数据类型转换成字符串的过程

  写入文件的数据必须是字符串
  基于网络传输的数据必须是二进制

5.2 什么是反序列化:
 
       序列化:其他数据类型转成字符串的过程
   反序列化:字符串转成其他数据类型

  5.3 json能够序列化的数据类型:
  
  json模块(******)
  所有的语言都支持json格式
  支持的数据类型很少 字符串 列表 字典 整型 元组(转成列表) 布尔值
  pickle模块(****)
  只支持python
  python所有的数据类型都支持
 实列:
  
mport json
with open(r'D:datasday161.txt','rt',encoding='utf-8')as f:
    # f方法一:
    # for line in f:
    #  ic = json.loads(res)
    # user_dic1 = json.load(f)
    # print(user_dic)
    # print(user_dic1)
    # print(user_dic)
    # for line in f:
    #     user_dic = json.loads(line)
    #     print(user_dic)

    # res = f.read()
    # user_dic =json.loads(res)
    # print(user_dic)
    # user_dic = json.load(f)
    # print(user_dic)
  总结今天遇到的问题:

  1.是在写随机生成验证码的时候忘记将 num = random.randint(0,9) 转成字符串 因为我们要拼接成字符串 alp_lower = chr(random.randint(65,90)
  2.在写文件os.listdir()将改目录下的所有文件打印出来;for index,moive in enumerate()在后面加了start=1 会将序列的索引变为从一开始
  3,在选择movie_list 文件名的时候 必须choice-1 因为moive_List[choice]是索引 所以要将1 索引默认是0 开始 不然取不到文件
  4.在写json模块序列化与反序列化的时候
  操作方法总结:
    序列化:json.dumps() dunmps() 是将其他数据类型转化成字符串直接存到文件
    反序列化:json.laods()是将字符串 读取成原来存的数字类型:注意若文件中存了多组记得for 依次循环获取每行字符串在通过
      res = f.read() 单行
      for line in f:
        user_dic = json.loads(line)
     json.loads(res/line)
    

  # dump():序列化:是将数据类型如 json 能就解析的数据类型:dict  lsit ,字符串,整形,bool,元组转成json中的列表对象、

   res = json.dump(user_dic,f) 通过文件句柄对象写到文件中

   load() 将字符串反序列为存的数据类型(user_dic) 通过操作文件反序列化。

      picle()写的时候注意是二进制 ,存的是对象obj

  json宗旨总之以什么方式存的,取得时候就给我返回什么数据类型

  

 
 
 




原文地址:https://www.cnblogs.com/mofujin/p/11210930.html