欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python 第八课模块2

程序员文章站 2022-07-09 23:38:09
...

模块

module and package

  • 定义:包是通过使用’.模块名’来组织python模块名称空间的方式,具体而言,包就是一个包含_init_.py文件的文件夹

  • 目的:用文件夹将文件/模块组织起来

  • 注意:

    • Py3 即使包中没有_init_.py 也可以使用
    • Py2 如果没有_init_.py肯定报错
  • 创建包的目的不是为了运行,而是为了被导入使用

  • 包的本质依然还是模块

    • 使用时,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'>