十八. Python基础(18)常用模块
十八. Python基础(18)常用模块
1 ● 常用模块及其用途
collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, OrderedDict time模块: 三种时间表示方法的转换 案例: 计算时间差 random模块: ① random.random() ② random.randint(1,5) ③ random.choice([1,'23',[4,5]]) ④ random.sample([1,'23',[4,5]],2) 案例: 随机生成验证码, 洗牌 os模块: 用于和操作系统交互→① 文件夹和文件的路径; ②文件夹和文件的创建和删除 sys模块: 用于和解释器交互→例如: 参数向量, 退出python程序 序列化模块: 用于数据类型和字符串之间的转换→(目的): 数据持久化(存储), 网络交互(交互) re模块: 正则 案例: 验证字符串的合法性, 爬虫 |
2 ● 模块的概念
A module is a file consisting of Python code. A module can define functions, classes and variables. Three roles of modules: ① Code reuse ② System namespace partitioning ③ Implementing shared services or data |
3 ● collections模块扩展类型示例
① collections.Counter([iterable-or-mapping]) from collections import Counter print(Counter('Hello').keys()) # 返回字典, dict_keys(['H', 'e', 'l', 'o']) |
② class collections.deque([iterable[, maxlen]]) from collections import deque dq = deque(['a', 'b', 'c']) dq.append('x') print(dq) # deque(['a', 'b', 'c', 'x']) dq.appendleft('y') print(dq) # deque(['y', 'a', 'b', 'c', 'x']) |
③ class collections.OrderedDict([items]/dictionary) # 案例1 dic = dict(int_list=[1, 2, 3], text='string', number=3.44, boolean=True, none=None) # 注意: 关键字参数中的关键字不能是表达式,即关键字不能写成'a' # 也不能用非字符串, 如整型数字, 列表等
print(dic) ord_dic = collections.OrderedDict(dic) # 建立有序词典 print(ord_dic.keys()) # odict_keys(['int_list', 'text', 'number', 'boolean', 'none'])
# 上面的关键字参数都打了引号 # {'int_list': [1, 2, 3], 'text': 'string', 'number': 3.44, 'boolean': True, 'none': None}
# 案例2 import collections od = collections.OrderedDict([('a', 1), ('b', 2), ('c', 3)]) #OrderedDict的参数是一个列表, 元素是元组类型 print(od.keys()) # odict_keys(['a', 'b', 'c']) |
⑤ class collections.defaultdict([default_factory[, …]]) # default_factory 接收一个工厂函数作为参数, 例如int str list set等 from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value)
print(my_dict) |
④ collections.namedtuple(typename, [field_names]/(field_names)) # "typename"随便起名, 但要尽量表示现在命名的字段(field) import collections Po = collections.namedtuple('Point', ['x', 'y']) # 也可以写成('Point', ('x', 'y')) , # 一般写成: Point = collections.namedtuple('Point', ['x', 'y']), p = Po(1,2) # 不能写成Point print(p.x) print(type(Po)) # <class 'type'> print(type(p)) # <class '__main__.Point'> |
4 ● 有关time模块的几种用法
在Python中,通常有如下三种方式来表示时间: ① 时间戳(timestamp)--从格林威治时间1970年1月1日00:00:00以来的秒数, 浮点型 ② 结构化时间(struct_time)--元组形式(9个元素) ③ 格式化的时间字符串(formatted string of time)(例如: 'Tue Dec 11 18:07:14 2008') |
# 计算时间差 import time time_old=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S')) time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S')) dif_time=time_now-time_old print(dif_time) # 95400.0 struct_time=time.gmtime(dif_time) # 转换为格林威治时间(Greenwich Mean Time, GMT) print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1, struct_time.tm_mday-1,struct_time.tm_hour, struct_time.tm_min,struct_time.tm_sec))
# 过去了0年0月1天2小时30分钟0秒 |
import time 一. 结构化时间-->字符串时间: time.strftime ("f"代表from) ① 无中文的情况 t = time.strftime("%Y-%m-%d %H-%M-%S") print(t) # 2017-09-12 22-57-34
② 有中文的情况 t = time.strftime("%Y{y}%m{m}%d{d}, %H{h}%M{mi}%S{s}").format(y='年', m='月', d='日', h='时', mi='分', s='秒') print(t) # 2017年09月12日, 22时57分34秒
二. 字符串时间-->结构化时间(返回包含9个元素的元组) t = time.strptime('2008-08-08','%Y-%m-%d') print(t) ''' time.struct_time(tm_year=2008, tm_mon=8, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=221, tm_isdst=-1) ''' print(t[0:3]) ''' (2008, 8, 8) ''' |
import time print(time.ctime()) # Tue Sep 12 20:10:45 2017 # ctime()函数 print(time.asctime(time.localtime())) # Tue Sep 12 20:10:45 2017 |
※ ① time.localtime([secs]): Accepts an instant expressed in seconds since the epoch and returns a time-tuple t of the local time ② time.asctime([tupletime]): Accepts a time-tuple and returns a readable 24-character string such as 'Tue Dec 11 18:07:14 2008'. ③ time.ctime([secs]): Like asctime(localtime(secs)) and without arguments is like asctime( ) ④ time.gmtime([secs]): Accepts an instant expressed in seconds since the epoch and returns a time-tuple t with the UTC time. ⑤ time.mktime(tupletime): Accepts an instant expressed as a time-tuple in local time and returns a floating-point value with the instant expressed in seconds since the epoch.
#① 结构化时间-->字符串时间 #time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则现实当前时间
#② 字符串时间-->结构化时间 #time.strptime(时间字符串,字符串对应格式)
#③ 时间戳-->结构化时间 #time.gmtime(时间戳) #UTC时间,与英国伦敦当地时间一致 小时,UTC时间+8小时 = 北京时间
#④ 结构化时间-->时间戳 #time.mktime(结构化时间)
#⑤ 结构化时间 --> %a %b %d %H:%M:%S %Y串(例如:Tue Dec 11 18:07:14 2008) #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
#⑥ %a %d %d %H:%M:%S %Y串 --> 结构化时间 #time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 |
5 ● json模块和pickle模块
① json模块: 可以直接处理Python内置的数据类型(string、unicode、int、float、list、tuple、dict) 不能直接处理自定义的数据类型, 否则报错; ※ ② pickle模块可以直接处理Python内置的和自定义的类型. 具体的互相转化对照如下:
json模块提供了四个功能:dumps、dump(序列化,存)、loads、load(反序列化,读) pickle模块提供了四个功能:dumps、dump(序列化,存)、loads、load(反序列化,读) |
import json # ① json.dumps, json.loads, # 序列化:将字典转换成字符串 dic = {'k1':'v1','k2':'v2','k3':'值三'} # <class 'str'> {"k1": "v1", "k2": "v2", "k3": "\u503c\u4e09"} str_dic = json.dumps(dic,ensure_ascii=False) #print(type(str_dic ), str_dic) # <class 'str'> {"k1": "v1", "k2": "v2", "k3": "值三"} #注意,json转换完的字符串类型的字典中的字符串是由""表示的
dic2 = json.loads(str_dic) # 此时不用管编码的问题 #print(type(dic2), dic2) # <class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': '值三'}
# 处理嵌套的数据类型 list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_lst = json.dumps(list_dic) lst_dic2 = json.loads(str_lst) #print(type(str_lst), str_lst) # <class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
# ② json.dump, json,load # 反序列化:将字符串转换为字典 import json f = open("json.txt", encoding= 'utf-8', mode = "w") dic = {'k1':'v1','k2':'v2','k3':'值三'} json.dump(dic,f, ensure_ascii=False) f.close()
import json f = open("json.txt", encoding="utf-8", mode = "r") dic2 = json.load(f) print(type(dic2), dic2) # <class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': '值三'} f.close() |
# 实现多行的序列化 import json f = open('new_json.txt',encoding = "utf-8", mode = 'w') # json.dump({'国籍':'美国'},f,ensure_ascii=False) ret = json.dumps({'国籍':'美国'},ensure_ascii=False) f.write(ret+'\n') f.close() ################################################ f = open('json_file', encoding='utf-8', mode='w') for i in range(10): dic = {} dic[i] = i ret = json.dumps(dic, ensure_ascii=False) + "\n" f.write(ret) f.close() |
● json和pickle 模块的综合案例
import json
str_dumps = json.dumps({'键1':'值1','键2':'值2'}, ensure_ascii= False) # pickle没有ensure_ascii这个参数 print(type(str_dumps), str_dumps) # <class 'str'> {"键1": "值1", "键2": "值2"}
# 存 f = open('json_file','w') # 不能是wb模式 dic = {'键1':'值1','键2':'值2'} json.dump(dic,f, ensure_ascii= False) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件, ensure_ascii= False可有可无 f.close() # 读 f = open('json_file','r') # 不能是rb模式 load_dic = json.load(f) print(type(load_dic), load_dic) # <class 'dict'> {'键1': '值1', '键2': '值2'} |
import pickle
class Birthday: def __init__(self,year,month,day): self.year = year self.month = month self.day = day def show_info(self): print('''\ 出生日期为: 年: %s 月: %s 日: %s '''%(self.year, self.month, self.day))
birth_dict= {} # 作为整体序列化的对象, 里面是多个对象 birth_liu = Birthday('1988年','11月','11日') birth_dict['liu'] = birth_liu birth_wang = Birthday('1999年','12月','21日') birth_dict['wang'] = birth_wang
# 序列化, 存 f = open('pickle_file', mode = 'wb') # pickle_file必须以二进制可写模式打开 pickle.dump(birth_dict, f) f.close()
# 序列化, 读 f = open('pickle_file', mode = 'rb') # pickle_file必须以二进制可读模式打开, load_birth_dict = pickle.load(f) print(type(load_birth_dict)) # <class 'dict'>
for key in load_birth_dict: print(type(key)) # <class 'str'> print(load_birth_dict[key].__dict__)
load_birth_dict['liu'].show_info() #调用load出来的对象的方法{'year': 1999, 'month': 12, 'day': 21} ''' 出生日期为: 年: 1988 月: 11 日: 11 ''' |
● shelve模块
import shelve s = shelve.open('test.dat', writeback=True) s['x'] = ['a', 'b', 'c'] s['x'].append('d') print(s['x']) # ['a', 'b', 'c', 'd'] # 如果不设定writeback这个参数, 或者writeback=False, 那么s['x']是['a', 'b', 'c'] # 如果writeback=False,那么s['x']是['a', 'b', 'c'] |
● random随机数模块
random.random(): [0.0, 1.0),即>=0.0, 小于1.0的浮点数()
random.randint(a, b): >=a, <=b的整数(可以是负数) random.randrange(stop): 0到stop之间的整数(stop不可以是0或负数; 返回值可能是0) random.randrange(start, stop[, step]): 以step为步长, 0到stop之间的整数(返回值可能是整数或负数)
random.choice(seq) : 序列中的任意一个元素 random.sample(seqn, k) : 序列中的任意k个元素
random.shuffle(list): 打乱列表的顺序(返回None) |
import random print(random.random()) # 0.3193339282590387
print(random.randint(-10, 2)) # -9 print(random.randrange(9)) # 5 print(random.randrange(3, 9, 2)) # 7 print(random.randrange(-10, -2, 2))
print(random.choice([1,'23',[4,5]])) # 23 print(random.sample([1,'23',[4,5]], 2)) # [1, [4, 5]] l=[1,'23',[4,5]] random.shuffle(l) print(l) # [[4, 5], '23', 1] |
● hashlib模块
# ① 简单案例 import hashlib
md5 = hashlib.md5() md5.update('hello world'.encode('utf-8')) # 编码不同, 得到的,md5值也不一样 print(md5.hexdigest()) # ab0d1919682bf28718384c7ac797cc2f
# 上面的写法等价于: # md5.update(bytes('你好 # 也可以多次调用update(), 得到的结果一样: # md5.update('你好'.encode('utf-8')) # md5.update(' 世界'.encode('utf-8')) # print(md5.hexdigest()) # ab0d1919682bf28718384c7ac797cc2f
# 注意下面这种更加直接的写法 print(hashlib.md5('你好 |
# ② 计算一个文件md5码 import os
def GetFileMd5_1(filename): # 用于计算文件的MD5码 if not os.path.isfile(filename): return file_MD5= hashlib.md5() f = open(filename,'rb') for line in f: file_MD5.update(line) return file_MD5.hexdigest()
def GetFileMd5_2(filename): # 用于计算文件的MD5码 if not os.path.isfile(filename): return file_MD5= hashlib.md5() f = open(filename,'rb') while True: b = f.read(1024) if not b : break file_MD5.update(b) f.close() return file_MD5.hexdigest()
print(GetFileMd5_1('许巍-九月.wma')) # dfeccc069b1ff5796dd76c789bacf30b print(GetFileMd5_2('许巍-九月.wma')) # dfeccc069b1ff5796dd76c789bacf30b |
● configparser模块
※ .ini配置文件的格式: [section1] 键1=值1 键2=值1 ... ... [section2] 键3=值3 ... ... ... ... |
# .ini配置文件创建 import configparser
config=configparser.ConfigParser() # 返回一个ConfigParser对象
# 下面ConfigParser对象属性设置的与魔法方法__setitem__()相关 config['DEFAULT']={'ServerAliveInterval':'45', 'Compression': 'yes', 'CompressionLevel': '9', 'ForwardX11':'yes' }
config['bitbucket.org'] = {'User':'hg'}
config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
with open('example.ini', 'w') as configfile: config.write(configfile) |
● 日志模块logging
# 将日志输入文件, 并打印到控制台 # 将日志输入文件, 并打印到控制台 import logging
# ① 建立一个日志对象 logger = logging.getLogger() # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler()
# ② 设置输出的日志显示格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# ③ 指定日志显示格式 fh.setFormatter(formatter) # 指定写入文件日志显示格式 ch.setFormatter(formatter) # 指定输出到控制台的日志显示格式
# ④ 指定日志的输出目的地 logger.addHandler(fh) #logger对象可以添加多个fh和ch对象 logger.addHandler(ch) #logger对象可以添加多个fh和ch对象
# ⑤ 设置日志的级别 #logger.setLevel(logging.DEBUG) # 默认输出的日志级别是WARNING, 这里将日志级别设置为DEBUG
# ⑥ 设置具体的日志信息 logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message') ''' 2017-09-25 17:20:19,518 - root - WARNING - logger warning message 2017-09-25 17:20:19,519 - root - ERROR - logger error message 2017-09-25 17:20:19,520 - root - CRITICAL - logger critical message ''' |
详见: http://www.cnblogs.com/goodhacker/p/3355660.html |
十八. Python基础(18)常用模块的更多相关文章
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
- Python全栈开发之路 【第六篇】:Python基础之常用模块
本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...
- python基础之常用模块以及格式化输出
模块简介 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...
- Day5 - Python基础5 常用模块学习
Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...
- Python基础之常用模块
一.time模块 1.时间表达形式: 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: 1.1.时间戳(timestamp) :通常来说,时间 ...
- Python基础5 常用模块学习
本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...
- Python基础之--常用模块
Python 模块 为了实现对程序特定功能的调用和存储,人们将代码封装起来,可以供其他程序调用,可以称之为模块. 如:os 是系统相关的模块:file是文件操作相关的模块:sys是访问python解释 ...
- python基础(11)-常用模块
re(正则)模块 常用方法 findall() 以列表返回所有满足条件的结果 import re print(re.findall('\d','a1b2c2abc123'))#['1', '2', ' ...
- Python基础之常用模块(三)
1.configparser模块 该模块是用来对文件进行读写操作,适用于格式与Windows ini 文件类似的文件,可以包含一个或多个节(section),每个节可以有多个参数(键值对) 配置文件的 ...
随机推荐
- 多线程工具之CompletionService
这里涉及到Java的多线程并发知识,以及线程池相关的知识.就不在此说明了.具体说说CompletionService的应用场景和使用方法. 比如我们有10个线程需要丢到线程池里面去执行,然后把10个线 ...
- C#动态代理
所谓代理,就是不直接访问目标对象,而是由中间对象生成一个目标代理类,由中间代理对象来代理目标对象的方法.Java里面有JDK和CGLIB代理.C#里面则使用Castle代理.nuget引用如下: &l ...
- legend2---开发日志5(如何解决插件的延迟问题,比如vue)
legend2---开发日志5(如何解决插件的延迟问题,比如vue) 一.总结 一句话总结:元素可以先设置为隐藏,这样就不会让用户看到延迟的问题,然后等加载完再显示, 元素先设置为隐藏 加载完再显示 ...
- FireFox(火狐)浏览器的相关问题
如何加快FireFox(火狐)浏览器浏览网页速度 大部分网页加载缓慢的原因:1.宽带连接.网速不稳定2.浏览器本身问题,如果多开窗口浏览会占大量内存,而且磁盘空间没有做过优化,就这样电脑资源不够用,也 ...
- spring boot ----> jpa连接和操作mysql数据库
环境: centos6.8,jdk1.8.0_172,maven3.5.4,vim,spring boot 1.5.13,mysql-5.7.23 1.引入jpa起步依赖和mysql驱动jar包 &l ...
- MyEclipse配置Tomcat服务器(最简单的配置过程)
MyEclipse配置Tomcat服务器比较简单,在这里直接给出简要的配置步骤了,相信大家都能很容易明白…… 1.Window->Preferences 2.根据你的Tomcat版本找到对应的T ...
- linux进程管理之信号控制
使用信号控制进程 ====================================================================================kill,ki ...
- LOJ6036编码
每个串拆成两个,都插入trie数. 把trie树建出来后,每一条从根到叶子的链上最多只能有一个变量为1. 这是个经典的前后缀优化2-sat建图的套路. 树上的做法也就是边dfs边做而已. #inclu ...
- SWUST OJ(953)
单链表的删除操作的实现 #include <stdio.h> #include <stdlib.h> typedef struct LinkNode //单链表节点结构的定义 ...
- 『TensotFlow』RNN中文文本_下_暨研究生开学感想
承前 接上节代码『TensotFlow』RNN中文文本_上, import numpy as np import tensorflow as tf from collections import Co ...