Python 第八课模块2
模块
包
module and package
-
定义:包是通过使用’.模块名’来组织python模块名称空间的方式,具体而言,包就是一个包含
_init_.py
文件的文件夹 -
目的:用文件夹将文件/模块组织起来
-
注意:
- Py3 即使包中没有
_init_.py
也可以使用 - Py2 如果没有
_init_.py
肯定报错
- Py3 即使包中没有
-
创建包的目的不是为了运行,而是为了被导入使用
-
包的本质依然还是模块
- 使用时,import导入,导入带点的,点的最左边一定是包名
- import导入文件时,产生名称空间的名字源于文件,import包,名称空间同样源于文件(包)
_init_.py
导入包的本质导入它
➜ school tree . ├── api │ ├── __init__.py │ ├── students.py │ └── versions.py ├── cmd │ ├── __init__.py │ └── manage.py ├── db │ ├── __init__.py │ └── models.py └── __init__.py
import school
School.api.students.gets()
直接运行报错
要想让他运行 no error
school下的
_init_.py
添加from . import api
,找到api在api下的
_init_.py
添加from . Import student
可以运行test[外链图片转存失败(img-a7e7Mm8K-1564189871670)(/Users/xujiaqi/Library/Application Support/typora-user-images/image-20190725141610220.png)]
[外链图片转存失败(img-sn4FEB0b-1564189871672)(/Users/xujiaqi/Library/Application Support/typora-user-images/image-20190725141642303.png)]
[外链图片转存失败(img-0iHomt4K-1564189871672)(/Users/xujiaqi/Library/Application Support/typora-user-images/image-20190725141722922.png)]
From…import…时,import后导入的模块,必须是一个不包含点(.),否则报错
在school/api/versions.py中导入school/cmd/manage.py
#在school/api/versions.py中
from school.cmd import manage #绝对导入
manage.main()
from ..cmd import manage #相对导入
字符编码
python主要识别文字内容,而不是关心拓展名。—>解释器
字符——>机器翻译——>二进制
字符如何对应特定数字的标准,这个标准就是字符编码
ASCII
GBK
Unicode
UTF-8(Unicode Transformation Format)
- 对于英文字符来说,1Bytes
- 中文字符,3bytes
- 对于其他偏僻字符,更多的bytes存储
对于内存而言—>unicode
#time 模块
import time
time.sleep([n]) #休眠
time.time()#获取当前时间戳
在python中,表示时间通常有三种方式:
- 时间戳(timetamp):表示的是从1970.01.01 00:00:00 开始按秒计算的偏移量
- 格式化的时间字符串(format string)
2019-7-26 08:46:30
- 结构化的时间(struct_time)—>元素,9个元素(年月日时分秒。一年的第几周,一年的第几天,夏令时
>>> import time
>>> time.time()
1564102386.316857
[i for i in dir(time) if not i.startswith('_')]
['altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time', 'process_time_ns', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'time_ns', 'timezone', 'tzname', 'tzset']
>>> time.strftime('%Y-%m-%d %X')
'2019-07-26 08:56:08'
>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=8, tm_min=58, tm_sec=2, tm_wday=4, tm_yday=207, tm_isdst=0)
>>> time.localtime()[2] #索引
26
time 模块的常用方法
方法 | 描述 |
---|---|
time.localtime([sec]) | 将一个时间戳转化为一个当前时区的struct_time(若未提供参数,当前时间) |
time.gmtime([sec]) | 和localtime()类似,不同的是,其是将一个时间戳转换为UTC时区(0时区)的atruct_time |
time.time() | 返回当前时间戳 |
time.mktime(t) | 将time.struct_time转化为时间戳 |
time.sleep(sec) | 线程推迟指定的时间运行,单位(s) |
time.asctime([t]) | 把表时间的元组或struct_time表示为:‘Sun July 26 09:06:35 2019’;如果未传参数,默认为time.localtime() |
time.ctime([t]) | 把一个时间戳转化为time.asctime()的形式。如果未传参数,默认time.time() |
time.strftime(format[,t]) | 把一个代表时间的元组/struct_time(localtime()和gmtime())转化为格式化字符串,未传参数,默认为time.localtime() |
time.strptime() | 将格式化字符串转化为truct_time形式 |
- 时间戳,计算机识别的
- 字符串时间,人类可以看的
- 结构化时间,对时间操作
时间戳和结构化时间的转化
>>> now = time.time()
>>> time.gmtime(now) #UTC时间 0时区
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=1, tm_min=17, tm_sec=39, tm_wday=4, tm_yday=207, tm_isdst=0)
>>> time.localtime(now) #当地时间,以北京所在时区为准
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=9, tm_min=17, tm_sec=39, tm_wday=4, tm_yday=207, tm_isdst=0)
结构化时间和时间戳的转化
-
time.mktime(结构化时间)
>>> tp_struct =time.localtime() >>> time.mktime(tp_struct) 1564104178.0 >>> time.time() 1564104216.130652
结构化时间到字符串时间的转化
-
time.strftime(format[,t])
>>> tp_struct = time.localtime() >>> time.strftime('%Y-%m-%d %X',tp_struct) '2019-07-26 09:26:49' >>>
字符串时间到结构化时间的转化
- time.strptime(时间字符串,字符串对应格式)
>>> time.strptime('2019-7-26','%Y-%m-%d')
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=207, tm_isdst=-1
>>> time.strptime('2019/07/26','%Y/%m/%d')
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=207, tm_isdst=-1)
>>>
结构化时间和字符串时间转化(国际化时间字符串)
-
time.asctime(结构化时间)
-
>>> sp_struct = time.localtime() >>> time.asctime(tp_struct) 'Fri Jul 26 09:26:49 2019' >>> time.asctime() 'Fri Jul 26 09:50:10 2019' >>>
时间戳和字符串的转化(国际化)
>>> time.ctime(time.time())
'Fri Jul 26 09:51:46 2019'
>>> time.ctime()
'Fri Jul 26 09:51:55 2019'
>>> time.ctime(100000000)
'Sat Mar 3 17:46:40 1973'
>>>
#datetime 模块
相比time来说,datetime模块接口更直观,更容易调用
方法(类) | 描述 |
---|---|
datetime.date | 表示日期(类),常用属性year,mouth,day |
datatime.time | 表示时间(类)常用属性hour,minute,second,microsecond |
datetime.datetime | 表示日期 |
datetime.timedelta | 表示时间间隔 |
datetime.tzinfo | 与时区有关的信息 |
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2019, 7, 26, 10, 2, 18, 208218)
>>> print(datetime.datetime.now())
2019-07-26 10:02:38.656142
>>> print(datetime.datetime.now().date())
2019-07-26
>>> print(datetime.datetime.now().time())
10:04:22.100412
>>>
sys 模块
sys模块是与python解释器交互的一个接口
处理命令行参数
在解释器启动后,argv列表包含了传递脚本的所有参数,列表的第一个元素是脚本自身的名称。
import sys
print(sys.version)
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21)
[Clang 6.0 (clang-600.0.57)]
import sys
print('script name is:',sys.argv[0])
if len(sys.argv)>1:
print('there are',len(sys.argv)-1,'arguments:')
for i in sys.argv[1:]:
print(i)
else:
print('there is no arguments')
script name is: /Users/xujiaqi/PycharmProjects/untitled2/xu.py
there is no arguments
#序列化模块
序列化
概念:将一个对象从内存中转换为可储存(字符串类型)或者可传输(bytes)类型的过程
python 中pickling
为什么要使用序列化?
- 持久化数据类型
- 跨平台交互使用
- 使程序更易维护
json
json格式在各个语言中都可以通用序列化格式,在json中,所有的字符串必须为""。
json类型 | python |
---|---|
{} | dict |
[] | list |
“string” | str |
1234.56 | int/float |
true/false | True/False |
null | None |
json优缺点:
- 优点:所有的数据类型是各语言通用的
- 缺点:
- json只支持比较少的数据类型
- 对数据类型的约束十分严格
- 字典中的key必须是字符串
- json只支持列表,字典,数值,字符串以及布尔值
查看json的方法和属性
四个功能
- dumps
- dump
- loads
- load
>>> import json
#序列化
>>> dic = {'name':'city college',"age":20,'type':'university'}
>>> sr_dic = json.dumps(dic)
>>> type(sr_dic)
<class 'str'>
>>> sr_dic
'{"name": "city college", "age": 20, "type": "university"}'
>>> print(sr_dic)
{"name": "city college", "age": 20, "type": "university"}
>>> dic
{'name': 'city college', 'age': 20, 'type': 'university'}
#反序列化
>>> dic = {"name": "city college", "age": 20, "type": "university",2:6}
>>> sr_dic = json.dumps(dic)
>>> sr_dic
'{"name": "city college", "age": 20, "type": "university", "2": 6}'
>>> dic_2 = json.loads(sr_dic)
>>> type(dic_2)
<class 'dict'>
>>> dic_2
{"name": "city college", "age": 20, "type": "university", '2': 6}
#如果是元组
>>> dic = {"seq":(1,2,3)}
>>> dr_dic = json.dumps(dic)
>>> dr_dic
'{"seq": [1, 2, 3]}'
>>> dic_=json.loads(dr_dic)
>>> dic_
{'seq': [1, 2, 3]}
>>> dic={(1,2,3):"seq"}
import json
dic = {"name": "city college", "age": 20, "type": "university",2:6}
with open('dump_json','w')as f:
json.dump(dic,f) #dump方法可以接收一个文件句柄,直接将字典->字符串,写入文件中
with open('dump_json')as f:
ret = json.load(f)
print((ret,type(ret)))
({'name': 'city college', 'age': 20, 'type': 'university', '2': 6}, <class 'dict'>)
dic = {"name": "city college", "age": 20, "type": "university", 2: 6}
dic2 = {'city': 'hangzhou', 'history': 5000}
with open('dump_json', 'w')as f:
str_dic1 = json.dumps(dic)
str_dic2 = json.dumps(dic2)
f.write(str_dic1 + '\n')
f.write(str_dic2 + '\n')
with open('dump_json')as f:
for line in f:
ret = json.loads(line)
print(ret)
{'name': 'city college', 'age': 20, 'type': 'university', '2': 6}
{'city': 'hangzhou', 'history': 5000}
pickle
只用于python
内存中结构化的数据<—>格式pickle<—>bytes类型<—>保存在文件或基于网络传输
pickle 优缺点
- 优点
- 支持python中的几乎所有数据类型
- pickle会把数据类型序列化为bytes类型
- 缺点
- 只支持python
模块提供四个功能
- 序列化
- dumps
- dump
- 反序列化
- loads()
- load()
import pickle
dic = {"name": "city college", "age": 20, "type": "university", 2: 6}
dic_b = pickle.dumps(dic)
print(type(dic_b))
dic_d=pickle.loads(dic_b)
print(type(dic_d))
<class 'bytes'>
<class 'dict'>
上一篇: UG8.0怎么安装? UG8.0安装技巧
下一篇: react 学习笔记第二次课