一、文件的处理
数据持久化最简单的类型就是普通文件,有时也叫做平面文件(flat file)。文件是计算机中由OS(操作系统)管理的具有名字的存储区域,在linux系统上,文件被看作是字节序列。
fileobj=open(filename, mode,buffering=-1,...) 打开文件
fileobj是open()函数返回的文件对象
filename需要打开的文件的字符串名
buffering:是否使用缓存,0表示输出无缓存,1表示使用缓存;
负数表示使用默认设置,正数表示使用近似指定的大小。
mode指定文件的打开模式:
r表示读模式
r+表示可读写文件。【可读;可写;可追加】
w表示写模式,如果文件不存在则新创建,如果存在则重新些内容
w+,写读
x表示文件不存在的情况下新创建并写文件。
a表示文件如果存在,在文件末尾追加内容。
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
mode的第二个字母代表文件的类型:t代表文本类型,b代表二进制文件
文件的操作方法:
f.read([n])
做多读取n个字节
f.readline([n])
读取单行输入的做多n个字节,如果省略n,该方法将读取整行
f.readlines([size])
读取所有行并返回一个列表,size可选,用于指定在读取操作停止前在文件上读取的近似字符数
f.write(s)
写入字符串
f.writelines(lines)
写入序列lines中的所有字符串
f.close()
关闭文件
f.tell
返回当前文件的指针
f.seek(offset [,whence])
跳转到文件其他字节偏移量的位置
whence:0(默认)表示从开头偏移offset个字节
whence:1表示从当前位置处偏移offset个字节
whence:2表示从距离文件结尾处偏移offset个字节
f.isatty()
如果f是一个交互式终端,则返回1
f.flush()
清除输出缓冲区
f.truncate([size])
将文件截断为最多size字节
f.fileno()
返回一个整数描述符
f.next()
返回下一行或引发stopIteration,python3中,对应方法f.__next__()
使用with自动关闭文件:
当打开文件进行操作后忘记关闭时,在该文件对象不再被引用后python会关掉此文件。这意味着在一个函数中打开文件,没有及时关闭它,函数结束时会被关闭。但是当一直运行中的函数或者程序的主要部分打开一个文件,应该强制剩下的所有写操作完成后才关闭文件。
python的上下文管理器会清理一些资源,例如打开文件。形式为:with context as var:statements
完成代码编辑后文件自动关闭。
二、对象流式化与持久化存储
Python 程序在实现文件读取或写出时,要使用转换工具把对象转换成字符串。持久性的基本思想很简单,假定有一个Python 程序,它可能是一个管理日常待办事项的程序,你希望在多次执行这个程序之间可以保存应用程序对象,此时就需要持久存储对象内容。python中只要有三个模块用于流式化或持久化存储数据:
json, 用于字符串和python数据类型间进行转换
pickle 模块 (将对象转换为文件存储),读写文件时应使用二进制打开
shelve 模块(自动将对象pickle进和pickle出键转换为文件系统,按字典方式查询方式)
pickle、Json 模块提供了四个功能:dumps、dump、loads、load,而shelve模块通过open函数打开shelve对象后,就可以相当于字典一样操作。
dump(object, file)
dumps(object) -> string
将对象obj保存到文件file中去。
load(file) -> object
loads(string) -> object
从 file 中读取一个字符串,并将它重构为原来的python对象。
shelve模块
d = shelve.open(filename) # 打开文件,d 相当于字典对象
三、正则处理re模块
python中正则表达式的处理使用re模块。其主要方法有:
search(pattern, string, flags=0)
根据patter模式,在string字符串中返回第一次匹配到的
match对象。
符号标志:
I或IGNORECASE:忽略字符大小写
M或MULTILINE:跨行匹配
A或 ASCII:仅执行8位ASCII码匹配
U或UNICODE:执行UNICODE 码匹配
match(pattern, string, flags=0)
根据pattern匹配,返回一个match对象,只能检测字符串作为开头的源字符串。
match对象的属性:
string: 匹配的源字符串
re: 需要匹配的pattern
pos: 源字符串搜索的起始位置
endpos: 源字符串搜索的结束位置
match对象的方法:
group(): 匹配到的结果
groups():匹配到的分组结果以元组形式返回。
start(): 匹配到字符串的起始位置
end(): 匹配到字符串的结束位置
findall(pattern, string, flags=0)
以列表的方式,返回所有不重复的匹配对象
sub(pattern, repl, string, count=0, flags=0)
返回替换后整个串
subn(pattern, repl, string, count=0, flags=0)
返回元组替换后的串及替换次数
compile(pattern, flags=0)
手动编译模式对象,将正则表达式编译成Pattern对象
split(string[, maxsplit])
split(pattern, string[,maxsplit])
按照能够匹配的子串将string分割后返回列表。
maxsplit用于指定最大分割次数,不指定将全部分割
正则匹配规则:
语法
说明
表达式实例
完整匹配的规则
字符
.
匹配任意除换行符'\n'外的字符
a.b
aab
\
转义字符,使后一个字符改变原来的意思
a\.e
a.e
[...]
字符集。对应的位置可以是字符集中任意一个字符。
a[bc]d
abd,acd
预定义字符集
\d
数字[0-9]
a\db
a1b
\D
非数字[^0-9]
a\Db
abb
\s
空白字符
a\sb
a b
\S
非空白字符
a\Sb
\w
单词字符[a-zA-Z0-9]
a\wb
abb,a1b,aWb
\W
非单词字符
a\Wb
a b,a-b,a*b
数量匹配
*
匹配前一个字符0次或多次
ab*
a,ab,abb
+
匹配前一个字符1次或多次
ab+
ab,abb
?
匹配前一个字符0次或1次
ab?
a,ab
{m}
匹配前一个字符m次
ab{3}c
abbbc
{m,n}
匹配前一个字符m至n次
ab{1,2}c
abc,abbc
边界匹配
^
匹配字符串开头
^ab
ab
$
匹配字符串结尾
ab$
\A
仅匹配字符串开头
\Aabc
abc
\Z
仅匹配字符串结尾
abc\Z
\b
匹配字符串边界
cl\\b
ass\\b
'class'中cl无法匹配;
'class'中ass可以匹配
\B
不匹配字符串边界
cl\B
ass\B
'class'中cl可以匹配;
'class'中ass无法匹配
逻辑与分组
|
左右表达式任意匹配一个
abc|abd
abc,abd
(...)
如: \(ab\)*,将 ab 作为一个整体匹配
\n: 后向引用, 引用前面的第 n 个左括号以及与之对应的右括号中的模式所匹配
到的内容
(abc){2}
a(123|456)c
abcabc
a123c,a456c
(?P<name>...)
分组,除了原有的编号外,再指定一个额外的别名
(?P<id>abc)2
\<number>
引用编号为<number>的分组匹配到的字符串
(\d)abc\1
5abc5
2abc2
(?=name)
引用别名为name匹配到的字符串
(?P<id>\d)abc(?P=id)