collectiont模块\time模块\datetime模块\os模块\random模块\Json模块\pickle模块\subprocess模块
待补充 :hashlib模块(加密模块)\包\logging模块\configpaese模块\openpyxl模块
collectiont模块: namedtuple:具名元祖:
举例:想表示坐标点x为1 y为2的坐标
from collections import namedtuplepoint = namedtuple(‘坐标‘,[‘x‘,‘y‘,‘z‘]) # 第二个参数既可以传可迭代对象point = namedtuple(‘坐标‘,‘x,y,z‘) # 也可以传字符串.但是字符串之间以空格隔开p = point(1,2,5) # 注意元素的个数必须跟namedtuple第二个参数里面的值数量一致print(p,z)print(p,x)print(p,y)card = namedtuple(‘扑克牌‘,‘color number‘)card1 = namedtuple(‘扑克牌‘,[‘color‘,‘number‘])A = card(‘♠‘,‘A‘)print(A)print(A.color)print(A.number)city = namedtuple(‘日本‘,name person size)c = city(‘东京‘,‘R老师‘,‘L‘)print(c)print(c.name)print(c.person)print(c.size)collections与namedtuple的应用 deque双端队列:
队列: 先进先出(FIFO first in first out)
import queueq = queue.Queue() # 生成队列对象q.put(‘first‘) # 往队列中添加值q.put(‘second‘)q.put(‘third‘)print(q.get()) # firstprint(q.get()) # secondprint(q.get()) # thirdprint(q.get()) # 朝队列要值,如果队列中的值取完了,程序会在原地等待,直到从队列中拿到值
collections与deque的应用
from collertions import dequeq = deque([‘a‘,‘b‘,‘c‘])‘‘‘append在右边插入appendleft在左边插入pop从右边d出popleft从左边d出‘‘‘q.append(1)q.appendleft(2)print(q.pop()) # 1print(q.popleft()) # 2‘‘‘队列不应该支持任意位置插值只能在首位插值(不能插队)‘‘‘q.insert(1,‘哈哈哈‘) # 特殊点:双端队列可以根据索引在任意位置插值print(q.pop()) # 1print(q.popleft()) # 哈哈哈print(q.popleft()) # 2collections与deque的应用 OrderedDict有序字典:
normal_d = dict([(‘a‘,1),(‘b‘,2),(‘c‘,3)])print(normal_d) # {‘a‘: 1,‘b‘: 2,‘c‘: 3}from collections import OrderedDictorder_d = OrderedDict([(‘a‘,3)])order_d1 = OrderedDict()order_d1[‘x‘] = 1order_d1[‘y‘] = 2order_d1[‘z‘] = 3print(order_d1) # OrderedDict([(‘x‘,(‘y‘,(‘z‘,3)])for i in order_d1: print(i) # x,zprint(order_d) # OrderedDict([(‘a‘,(‘b‘,(‘c‘,3)])defaultdict默认值字典:
from collections import defaultdictvalues = [11,22,33,44,55,66,77,88,99,900]my_dict = defaultdict(List) # 后续该字典中新建的key对应的value默认就是列表for value in values: if value > 66: my_dict[‘k1‘].append(value) else: my_dict[‘k2‘].append(value)print(my_dict) # defaultdict(<class ‘List‘>,{‘k2‘: [11,66],‘k1‘: [77,900]})
如果指定用int类型返回值,又选择字典中不存在的key值:
my_dict1 = defaultdict(int)print(my_dict1[‘xxx‘]) # 0print(my_dict1[‘yyy‘]) # 0
如果指定用bool类型返回值,又选择字典中不存在的key值:
?my_dict2 = defaultdict(bool)print(my_dict2[‘xxx‘]) # Falsecounter:计数器
from collections import Counters = ‘abcdeabcdabcaba‘‘‘‘
如果不想用模块的知识点
思路:先循环当前字符串,将每一个字符串都采用字典新建键值对的范式 d ={} for i in s: d[i] = 0 ... print(d)
‘‘‘res = Counter(s)print(res)
time时间模块: time: time有三种表现形式:
1.时间戳 Timestamp
import timeprint(time.time()) # 与unix元年相距多少秒
2.格式化时间(用来展示给人看的) Format string
import timeprint(time.strftime(‘%Y-%m-%d‘)) # 2019-07-18print(time.strftime(‘%Y-%m-%d %H:%M:%s‘)) # 2019-07-18 11:25:30print(time.strftime(‘%Y-%m-%d %X‘)) # 2019-07-18 11:25:30,即%X等价于%H:%M:%s
3.结构化时间 struct_time
import time print(time.localtime())三者之间的结构关系(图):
# 下面的代码主要是展示它们之间的区别print(time.time())print(time.mktime(res))print(time.strftime(‘%Y-%m‘,time.localtime()))print(time.strptime(time.strftime(‘%Y-%m‘,time.localtime()),‘%Y-%m‘))time三种表现形式之间的关系 datetime:
import datetimeprint(datetime.date.today()) # date>>>:年月日print(datetime.datetime.today()) # datetime>>>:年月日 时分秒res = datetime.date.today()res1 = datetime.datetime.today()print(res.year) # 返回结果为:2019print(res.month) # 返回结果为:7print(res.day) # 返回结果为:18print(res.weekday) # <built-in method weekday of datetime.date object at 0x000001D48DC07B70>print(res.weekday()) # 返回结果为:3,若0~6表示星期,则0表示周一;若1~7表示星期,则7就是周日拓展:timetel_t与timedelta
current_time = datetime.date.today() # 日期对象timetel_t = datetime.timedelta(days=7) # timedelta对象res1 = current_time+timetel_t # 日期对象print(current_time-timetel_t)print(res1-current_time)
关键点:
日期对象 = 日期对象 +/- timedelta对象 timedelta对象 = 日期对象 +/- 日期对象 举例:计算今天举例今年过生日还有多少天# 只显示年月日birth = datetime.date(2019,12,21)current_time = datetime.date.today()print(birth-current_time) # 显示年月日# 若想显示时分秒?birth = datetime.datetime(2019,21,8,8)current_time = datetime.datetime.today()print(birth-current_time) # 显示年月日 时分秒了解知识点:UTC时间
dt_today = datetime.datetime.today()dt_Now = datetime.datetime.Now()dt_utcNow = datetime.datetime.utcNow()print(dt_utcNow,dt_Now,dt_today) # 2019-07-18 09:56:36.925833 2019-07-18 17:56:36.925833 2019-07-18 17:56:36.925833
random模块:
关于random模块中的各种方法:
import randomprint(random.randint(1,6)) # 随机取一个你提供的整数范围内的数字,包含首尾print(random.random()) # 随机取0~1之间的小数print(random.choice([1,3,4,5,6])) # 随机摇号,从列表中取元素?res = [1,6]random.shuffle(res) # 洗牌,打乱有序(列表)print(res)举例:生成5位数的随机验证码(大写字母,小写字母,数字等等)
需求提示:chr与random.choice,且封装成一个函数,用户想生成几位就生成几位
import randomdef get_code(n) code = ‘ ‘ for i in range(n): # 先生成随机的大写母子,数字 upper_str = chr(random.ranint(65,90)) lower_str = chr(random.ranint(97,122)) random_int = str(random.randomint(0,9)) # 从上面三段代码中随机选择一个作为随机验证码的某一位 code += random.choice([upper_str,lower_str,random.int]) return code # 返回的是随机生成的验证码res = get_code(4)print(res)
os模块:
定义:跟 *** 作系统打交道的模块
下面介绍一些os模块中的方法:
import osBASE_DIR = os.path.dirname(__file__)MOVIE_DIR = os.path.join(BASE_DIR,‘老师们的作品‘)movIE_List = os.Listdir(MOVIE_DIR)print(os.Listdir(r‘copy_pyth‘)) # 将文件夹中所有文件名以列表形式打印出来while True: for i,j in enumerate(movIE_List,1): print(i,j) choice = input(‘你想看谁(今日热搜:tank老师)>>>:‘).strip() if choice.isdigit(): # 判断用户输入的是否是纯数字 choice = int(choice) # 转化为int类型 if choice in range(1,len(movIE_List)+1): # 判断是否在列表元素个数范围内 # 获取用户想看的文件名 target_file = movIE_List[choice-1] # 拼接文件绝对路径 target_path = os.path.join(MOVIE_DIR,target_file) with open(target_path,‘r‘,enCoding=‘utf-8‘) as f: print(f.read())?os.mkdir(‘tank老师精选‘) # 自动创建文件夹print(os.path.exists(r‘copy_path‘)) # 判断文件是否存在print(os.path.isfile(r‘copy_path‘)) # 只能判断文件,无法判断文件夹?os.rmdir(r‘copy_path‘) # 只能删空文件夹?print(os.getcwd()) # 查看当前目录print(os.chdir(r‘copy_path‘)) # 切换当前所在的目录?# 获取文件大小print(os.path.getsize(r‘copy_path‘)) # 打印字节大小with open(r‘copy_path‘,enCoding=‘utf-8‘) as f: print(len(f.read()))
sys模块:
定义:跟python解释器打交道的模块
import syssys.path.append() # 将某个路径添加到系统的环境变量中print(sys.platform) # 获取当前系统平台 print(sys.version) # python解释器的版本
# 终端校验用户信息实例: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(‘用户不存在,无法执行当前文件‘)
序列化模块:
序列:字符串
序列化:其他数据类型转化为字符串的过程
写入文件的数据必须是字符串 基于网络传输的数据必须是二进制(str.encode())反序列化:字符串转成其他数据类型
Json模块:优缺点:
优点:所有的语言都支持Json格式 缺点:但是支持的数据类型很少,有 字符串,列表,字典,整型,元祖(转为列表),bool值内置的方法:
dumps :序列化,将其他格式数据类型转成Json格式的字符串 dump loads :反序列化,将Json格式的字符串转成其他格式的数据类型 load小技巧:加s的传入文件,不加s的不传文件
import Json?d = {‘name‘:‘jason‘}res = Json.dumps(d) # {"name":"jason"} Json格式的字符串,必须是双引号print(res,type(res)) # <class ‘str‘>res1 = Json.loads(res) # {‘name‘:‘jason‘}print(res1,type(res1)) # <class ‘dict‘> ?# 写入文件d = {"name":"jason"}with open(‘userinfo‘,‘w‘,enCoding=‘utf-8‘) as f: # 先转字符串并自动写入文件 Json.dump(d,f) # 若直接写Json.dump(d)则报错# 读取文件 d = {"name":"jason"}with open(‘userinfo‘,‘r‘,enCoding=‘utf-8‘) as f: res = Json.load(f) print(res,type(res)) # {‘name‘:‘jason‘} <class ‘dict‘>
如果进行多次反序列化 *** 作后:
# 失败案例:with open(‘userinfo‘,enCoding=‘utf-8‘) as f: Json.dump(d,f) Json.dump(d,f) with open(‘userinfo‘,enCoding=‘utf-8‘) as f: res = Json.load(f) # 不能够多次反序列化 res1 = Json.load(f) print(res,type(res)) print(res1,type(res1)) # 直接报错
反之:
# 成功案例: with open(‘userinfo‘,enCoding=‘utf-8‘) as f: Json_str = Json.dumps(d) Json_str1 = Json.dumps(d) f.write(‘%s\n‘%Json_str) f.write(‘%s\n‘%Json_str1)with open(‘userinfo‘,enCoding=‘utf-8‘) as f: for line in f: res = Json.loads(line) print(res,type(res))
关于dumps方法的一些运用:
import Jsont = (1,4)print(Json.dumps(t)) # [1,4]?d1 = {‘name‘:‘朱质健‘}print(Json.dumps(d1)) # {"name": "\u6731\u8d28\u5065"}d1 = {‘name‘:‘朱质健‘}# 避免结果被转码print(Json.dumps(d1,ensure_ascii=False)) # {"name": "朱质健"}
pickle模块:
优缺点:
优点:只支持python语言 缺点:但是支持python所有的数据类型注意点:用pickle *** 作文件时,文件的打开模式必须是b模式
import pickled = {‘name‘:‘jason‘}res = pickle.dumps(d) # 将对象直接转成二进制print(pickle.dumps(d)) # 二进制模式代码res1 = pickle.loads(res)print(pickle.loads(res),type(res)) # {‘name‘:‘jason‘} <class ‘dict‘>
?with open(‘userinfo_1‘,‘wb‘) as f: pickle.dump(d,f) # 虽然不报错,但是我们看不到结果 with open(‘userinfo_1‘,‘rb‘) as f: res = pickle.load(f) print(res,type(res))
subprocess模块:
sub :子 process :进程
PS :终端内输入taskList可查看进程详细信息的二进制码展示
subprocess内置的方法:
stdout :正确命令返回的结果 stderr :错误命令返回的提示信息应用场景:远程运维/ *** 控
关于远程运维/ *** 控:
1.用户通过网络连接上了你的这台电脑 2.用户输入相应的命令,基于网络发送给了你这台电脑上某个程序 3.获取用户命令,里面subprocess执行该用户命令 4.将执行结果再基于网络发送给用户最终就能实现,用户远程 *** 控你这台电脑的 *** 作!!!
终端使用taskList命令,并且使其转化为常用数据类型以展示:
while True: cmd = input(‘cmd>>>:‘).strip() import subprocess obj = subprocess.Popen(‘taskList‘,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) print(‘正确命令返回的结果stdout‘,obj.stdout.read().decode(‘GBK‘)) print(‘错误命令返回的提示信息stderr‘,obj.stderr.read().decode(‘GBK‘))总结
以上是内存溢出为你收集整理的python day16全部内容,希望文章能够帮你解决python day16所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)