- 文件的输入/输出,mode 的类型有 读模式(r),写模式(w),追加模式(a),没有就创建模式(x),t 表示文本文件,b表示的是二进制文件,xt 模式表示 如果不存在就创建一个新的,但是如果存在就报错
fout = open(filename,mode),
fout.write('I Love you')
fout.close()
2.文件命令中,write() 和print() 相同点都是可以返回值,但是print()里面有两个默认参数,seq=’ ‘, end = ‘\n’
3.一段异常处理的代码说明xt 模式的运行方式,如果没有就新创建,如果有就会报错,FileExistError的错误
try:
fout =open('relativity','xt')
fout.write('I LOVE You')
Exception FileExistError:
print 'the file has already exist!'
readline(),read(),readlines() 读操作,readlines() 动作是首先读入所有行,输出的时候没一行的输出,在读操作之前都是先打开文件,read()以后再去关闭文件
二进制文件的读和写,’wb’,’rb’ 只要含有 b 的都表示二进制的文件 !读写的是字节数,不是字符串!
6.使用with open(‘文件名’,’打开方式’),可以自动关闭文件 ,叫做‘上下文管理器! ’
with open('relativity','wt') as flout :
7.seek(), tell() 函数针对的是二进制文件,tell() 表示的是距离开始位置的字节数,seek() 表示跳转到文件其他字节偏移量的位置,bfile 表示 大小为256字节的二进制文件 fin.seek(255)
表示跳转到 255 字节上 ,seek(offset,origin) 一个表示偏移量
fin = open('bfile','rb')
fin.tell()
>>>fin.seek(255)
>>>0
>>> bdate = fin.read()
>>>len(bdate)
>1
>>>bdate()
>bdate[0]
>
8.几种结构化数据,为的是为后续使用的程序保存数据或者是向另外一个程序传送传递数据,它们会有很多格式,比如 分隔符 ,’<’ ‘>’ 标签,缩进,
常用的结构化数据有 XML, Json,Html ,YAML,CSV(逗号分隔值)
8.1 标准的CSV模块(带分隔符的文件) ,我们可以通过不同的分割函数 进行 划分,不同的函数可以得到不同的结果,writer和
import csv
villian = [
['Doctor','No'],['Rosa','klebb'],['Mister','Big']
]
>>> with open('villian','wb') as fout:
>>>csvout = csv.writer(fout)
>>>csvout.writerows(villian)
>>> with open('villian','rt') as fin :
>>> cin = csv.reader(fin)
villians = [i for i in cin ]
>>> with open('villian','rt') as fin"
>>>cin = csv.DictReader(fin,filednames=['first','last')
>>> villians = [i for i in cin ]
- XML文件 ,csv 只有两维的数据!,xml文件可以在程序间把 数据结构,层次结构,序列和集合全部编码成文件
xml 具有一些重要的特性,用<字符开始,用相同的标签结束eg :
<?xml version='1.0'?>
<menu>
<dinner price='$5.4'>humburger</dinner>
</menu>
xml 常常用来处理 数据传输和 消息,他有多个子格式 解析xml 最简单的方式是 ElementTree
import xml.etree.ElementTree as et
tree = et.elementTree(file='menu.xml')
root = tree.getroot()
python中有多个方法和性能各异的python库,比如xml.dom ,js开发者比较熟悉的文档对象模型(dom)将Web文档表示成层次结构
- Json ,是一个js子集,python的兼容性使得Json变成程序间数据交换较好的选择 ,它只有一个模块(json),程序将数据变成json字符串,然后通过解码的形式形成数据,
原始数据menu
menu = \
{
"breakfast":{
"hours":"7-11",
"items": {
"breakfast burritons":"$6.00"
"pancakes":"$4.00",
},
"lunch":{
"hour":"11-3",
"item":{
"hamburger":"$5.00"
}
},
"dinner":{
"hour":"3-10",
"items":{
"spaghetti":"$8:00",
}
}
}
利用dump 把数据编码成 json字符串 ,给我的感觉是中间的空格都没有了
import json
menu_json = json.dump(menu)
menu_json
在得到json 字符串以后还可以通过load()方法进行解析成python的数据结构
menu2 = json.load(menu_json)
在编码的时候 或者是 解析json字符串的时候,可能出现错误 ,比如 对象的datetime对象,因为标准的json没有定义时期和时间类型,需要先把数据转成 json能理解的 类型
now_str = str(now)
>>> josn.dump(now_str)
>>>from time import mktime
>>>now_epoch = int(mktime)
- YAML 数据结构,有键值对,主要是处理日期和时间的格式类型,python需要安装第三方库yaml,
load() 方法:把字符串---->python数据结构
dump()方法:python———->字符串
import yaml
>>>with open('mcintyre.yaml','rt') as fin:
>>> text = fin.read()
>>>data = text.load(text)
>>>data['detail']
8.2.7 程序中配置文件的选择
动态设置可以通过传入程序参数,但是有些程序参数需要长时间的保存,所以配置文件需要选用比较好的方式,需要两个步骤,一个是写入配置文档,一个是读取配置文档 ,需要引入标准的模块configparser处理初始化的.ini文档
setting.py文档
[Engilish]
greeting = 'hello'
[Freach]
greeting = 'Bonjour'
[files]
home = /usr/local
bin = %(home)s/bin
调用setting.py文档的程序,调用一个configparser
模块的参数,然后使用这个变量进行读取
import configparser
cfg= configparser.ConfigParser()
cfg.read('setting.py')
>>>cfg['french']
>>>
8.2.8二进制数据交换的方式,比较(XML,Json)的格式更快,更加复杂
8.2.9 序列化(pickle)
存储数据结构到文件中成为序列化 ,序列化的英文名称”serializing”,比如json类型,序列化的时候需要有特定的数据转换器,pickle模块就是通过二进制格式保存和恢复数据类型,
比如json类型对象在解析(dump)datatime类型的时候会报错,但是使用pickle就可以解决
import pickle
import datetime
now1 =datatime.datetime.utcnow()
picked = pickle.dumps(now1)#
now2 = pickle.loads(picked)
可以得到的结果是now1 =now2 ,之前使用json格式进行dumps的时候会报错
pickle 适用的范围还可以是自己定义的def 和class
import pickle
clss Tiny():
def __str__(self):
return 'tiny'
obj1=Tiny()
>>>pickled = pickle.dumps(obj1)#序列化
obj2 = pickle.loads(pickled)
发现obj1 和obj2 其实内存地址是不一样的,这个例子说明pickle函数是需要创建一个新的python对象的
8.3 结构化二进制文件
介绍两种广泛使用的二进制的格式的文件,一种是电子数据表,比如Excel,是一种
一种是层次数据格式(HDF5),用于多维数据或者层次数值数据的二进制格式,主要用于读取海量的数据集
8.4 关系型数据库
通过非主键的列查找数据,可以定义一个二级索引,否则数据库需要扫描所有表单,暴力查找!
8.4.1 SQL 语句的类型
DDL (数据定义语言)+DML 数据操作语言
8.4.2DB-API
DB-API是python访问关系型数据库的标准接口,类似于Java的JDBC,主要有的函数connect()
,cursor()
,execute()
,fetchone(),fetchmany(),fetchall()
8.4.3SQLite 数据库
1.使用python的标准库实现的,
2.优点:可以存储数据库在普通文件中,在不同的机器和操作系统之间是可移植的
3.缺点,不同于全面的mysql,只能支持原生的SQL和多用户并发操作,浏览器,智能手机和其他应用会把SQLite作为嵌入数据库
4.使用方法
import sqlite3
conn = sqlite3.connect('DBName')
curs = conn.cursor()
curs.execute('SQL语句')
#为了防止SQL注入,需要使用占位符的形式,把SQL语句写成空格的形式插入,感觉只是在insert里面
ins = 'insert into zoo(column1,column2,column3)values(?,?,?)'
curs.execute(ins,('weasel',1,2000.0))
8.4.5 MySQL和PostgreSQL数据库
它是真正的数据库服务器,
常用的Python 连接MySQL的驱动程序?
8.4.6 SQLAIchemy
是一种跨数据库的python库!可以在三个层面进行使用该库,我们从最底层开始往上说
特点:SQLAIchemy不需要倒入驱动程序,只需要使用初始化的连接字符串(connection string )就可以了dialect+driver://user:passwd@host:port/dbname
第一层面(引擎层):
负责处理数据库连接池,执行SQL命令和返回结果,功能和DB-API相似,优势在于在于不需要倒入数据库驱动程序,只需要改变连接字符串就可以连接到其他数据库上面去了
import sqlalchemy as sa
conn = sa.create_engine('sqlite://')
conn.execute('create的SQL语句')
ins = insert into zoo(critter,count1,damages)values(?,?,?)
row = execute(ins,'duck',20000)
#注意row生成的类型不是一个列表,但是可以像列表一样可以循环输出
for i in row:
print i
第二层面(SQL语言表达层):
主要是实现python的SQL生成器,可以创建多种SQL操作的函数,相比第一层,它可以处理更多SQL的差异
第三个层面(ORM)
对象关系模型(ORM),使用SQL语句把程序代码和关系型数据库结合起来