Python模块之day4
模块,代码归类实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file是文件操作相关的模块
模块分为三种:
- 自定义模块
- 第三方模块
- 内置模块
自定义模块
1.定义模块
2.导入模块
导入模块默认寻找的路径
import sys
#print sys.path
for i in sys.path:
print(i) C:\Users\Administrator\PycharmProjects\dbb0928\1106 #pycharm 自动添加的路径
C:\Users\Administrator\PycharmProjects\dbb0928 #IDIL,或者Linux里没有,最好忽略
C:\python\python35.zip
C:\python\DLLs
C:\python\lib
C:\python
C:\python\lib\site-packages
上面的路径,即是调用模块的顺序,一旦找到调用的函数,则停止寻找 ****模块名称命名很重要****
自定义的模块名字不要跟系统的模块命名相同,不然会首先调用你自己的函数,忽略系统函数
如果sys.path路径列表没有你想要的路径,那么怎么添加默认路径
- 通过 sys.path.append('路径') 添加。
import sys
import os pre_path = os.path.abspath('../')
sys.path.append(pre_path)
2. 设置环境变量PYTHONPATH
该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。
导入模块的方式
#推荐导入方法
1.单模块,在同一目录下
import module #导入可以调用该模块的所有函数,使用方法module.xxx() 2.嵌套在文件夹下
from module.xx.xx import xx #导入模块里的某个函数
from module.xx.xx import xx as rename # 当模块名字相同是,可以重命名
from module.xx.xx import * #导入模块下的所有函数,不建议使用,容易重名
开源模块
1.下载安装
下载安装有两种方式:
#方式一
yum
pip
apt-get
... #方式二 下载源码
解压源码
进入目录
编译源码 python setup.py build
安装源码 python setup.py install #注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行:
yum install gcc
yum install python-devel
或
apt-get python-dev
安装成功后,模块会自动安装到 sys.path 中的某个目录中,如:
/usr/lib/python3.5/site-packages/
python 序列化
把变量从内存中变成可存储或传输的过程称之为序列化,在程序运行的过程中,所有的变量都是在内存中,那么我们修改某个字典的values后,如果程序退出,则下次再运行程序,values,则会被初始化原来的值。
如果序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
Python用于序列化的两个模块:
1. pickle
pickle,用于python特有的类型 和 python的数据类型间进行转换,支持Python所有的数据类型,一般用于比较复杂的序列化,如游戏数据存档。
- dump,dumps
#pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件
>>> import pickle
>>> d = {'name':'bob','age':14,'score':88}
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x05\x00\x00\x00scoreq\x01KXX\x03\x00\x00\x00ageq\x02K\x0eX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00bobq\x04u.' #另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:
>>> f = open('dump.txt','wb')
>>> pickle.dump(d,f)
>>> f.close()
- load,loads
#字符串反序列化,文件里可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象 >>> print(d)
{'score': 88, 'age': 14, 'name': 'bob'}
>>> nb = pickle.dumps(d)
>>> print (nb)
b'\x80\x03}q\x00(X\x05\x00\x00\x00scoreq\x01KXX\x03\x00\x00\x00ageq\x02K\x0eX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00bobq\x04u.'
>>> pickle.loads(nb)
{'name': 'bob', 'age': 14, 'score': 88} #也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象 >>> d = pickle.load(f)
>>> f.close()
>>> d
{'name': 'bob', 'age': 14, 'score': 88}
2.json
json,用于字符串 和 python数据类型间进行转换,仅支持python的基本数据类型,但可以在语言之间传递对象,能直接在Web页面中读取,非常方便。
- dump,dumps,load,loads
#把Python对象变成一个JSON:
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d) # dumps()方法返回一个str
'{"age": 20, "score": 88, "name": "Bob"}' #使用dump写入文件
>>>with open('dump.txt','w') as f:
json.dump(d,f) #JSON反序列化为Python对象: >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}' #注意字典里一定要双引号
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'} #使用load 读出文件
>>> with open ('load.txt','r') as f:
ret= json.load(f)
print('ret')
- 进阶用法
#有时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化:
import json class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score s = Student('Bob', 20, 88)
print(json.dumps(s)) #错误输出
Traceback (most recent call last):
...
TypeError: <__main__.Student object at 0x10603cc50> is not JSON serializable
错误的原因是Student对象不是一个可序列化为JSON的对象 #然而可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可: def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
} #这样,Student实例首先被student2dict()函数转换成dict,然后再被顺利序列化为JSON: >>> print(json.dumps(s, default=student2dict))
{"age": 20, "name": "Bob", "score": 88} #不过,下次如果遇到一个Teacher类的实例,照样无法序列化为JSON。我们可以偷个懒,把任意class的实例变为dict: print(json.dumps(s, default=lambda obj: obj.__dict__)) ##同样的道理,如果我们要把JSON反序列化为一个Student对象实例,loads()方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例: def dict2student(d):
return Student(d['name'], d['age'], d['score']) 运行结果如下: >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x10cd3c190>
Python模块之day4的更多相关文章
- Python之旅Day4 闭包函数 模块及模块倒入
闭包函数 闭包函数就是在内部函数当中有对外部函数名字的引用 ###代码示例1### def f1(): x =1 def f2(): print(x) return f2 f=f1() f() ### ...
- Python之路,Day4 - Python基础4 (new版)
Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...
- 使用C/C++写Python模块
最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...
- Python模块之configpraser
Python模块之configpraser 一. configpraser简介 用于处理特定格式的文件,其本质还是利用open来操作文件. 配置文件的格式: 使用"[]"内包含 ...
- Python模块之"prettytable"
Python模块之"prettytable" 摘要: Python通过prettytable模块可以将输出内容如表格方式整齐的输出.(对于用Python操作数据库会经常用到) 1. ...
- python 学习第五天,python模块
一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...
- windows下安装python模块
如何在windows下安装python模块 1. 官网下载安装包,比如(pip : https://pypi.python.org/pypi/pip#downloads) pip-9.0.1.tar. ...
- 安装第三方Python模块,增加InfoPi的健壮性
这3个第三方Python模块是可选的,不安装的话InfoPi也可以运行. 但是如果安装了,会增加InfoPi的健壮性. 目录 1.cchardet 自动检测文本编码 2.lxml 用于解析 ...
- Python基础篇【第5篇】: Python模块基础(一)
模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...
随机推荐
- mysql 学习官网
http://www.runoob.com/mysql/mysql-install.html
- ASP.NET中的chart控件绑定SQL Server数据库
网上很多的chart控件的实例都没有绑定数据库,经过一番摸索后,终于实现了chart控件绑定数据库. 首先,在Visual Studio中建立一个网站,新建一个WebForm项目,名称为ChartTe ...
- Android笔记:动画
android:fromDegrees 起始的角度度数 android:toDegrees 结束的角度度数,负数表示逆时针,正数表示顺时针.如10圈则比android:fromDegrees大3600 ...
- jquery 替换文本内容
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- python之路:Day02 --- Python基础2
本节内容 1.列表操作 2.元组操作 3.字符串操作 4.字典操作 5.集合操作 6.文件操作 7.字符编码与转换 一.列表操作 定义列表 names = ['Ming',"Hua" ...
- jsf初学数据表(DataTable)的绑定
来看看简单的datatable例子: faces: <h:form> <h:dataTable value="#{tableData.names}" var=&q ...
- C++ 系列:C++ 基础 002
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- 基于netty-socketio的web推送服务
实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推 ...
- 解决Jquery mobile点击较长文本body的时候Header和footer会渐入渐出的问题
在做一个Phonegap+Jqm工程的时候,出现了如题的问题,相信很多人都遇到过Jquerymobile点击body时候header和footer会闪烁的显示和隐藏问题,fixed却并不能真 ...
- CozyRSS2开发记录0-win10开坑
1.回顾 距离上一篇<CozyRSS1.0 - 有可用性版本>,恰好两个月整.在初步完成CozyRSS的WPF桌面版后,按照设想的,开始搞一个手机版的CozyRSS.由于种种原因,并没有使 ...