安装 python 和 Pydev插件
eclipse -> help -> install new software -> http://pydev.org/updates
选中pydev安装插件https://www.python.org/
windows下载安装python 安装文件里面有个chm文档 , 很不错的帮助文件
然后python项目也可以使用git插件实现版本控制 挺方便的
python访问数据库
MYSQL数据库创建的时候默认的MyISAM引擎不支持事务的操作, 也就是不能回滚, 不存在commit,rollback
只有InnoDB的引擎才支持提交和回滚
回滚的原理是, 使用异常机制, 对数据库处理语句放在try代码块中,当发生异常的时候commit得不到执行,从而转向到异常处理语句中
然后在异常处理中调用rollback
DB API 数据库连接对象connection
conn = MySQLdb.Connect(host,port,user,password,db,charset)
比如: conn = MySQLdb.Connect('127.0.0.1',3306,root,'123456','testdb','utf8')
connection对象常用方法
cursor = conn.cursor() #使用该连接创建并返回游标
conn.commit() #提交
conn.rollback() #回滚
conn.close() #关闭数据库连接
cursor.close()
cursor 对象支持的方法
execute 执行后, 数据库返回的结果集被放在本地缓存中, 游标的作用就是从缓存中区中读取数据,每次执行fetch语句后,游标都会向后移动
cursor = conn.cursor()
cursor.execute(op[,args]) #习性一个数据库查询和命令
cursor.execute(sql)
cursor.rowcout #execute返回的数据行数
rs = cursor.fetchone() #获取结果集的下一行 , 返回结果保存为rs
rs = cursor.fetchmany(size) #获取结果集的size行 返回结果保存为rs
rs = cursor.fetchall() #获取结果集剩下的所有行 返回结果保存为rs
for row in rs:
print "userid=%s, username=%s" % row
cursor.close()# 关闭游标对象
inser/update/delete 操作示例
事务: 为了实现一组 操作的原子性,一致性,隔离性,持久性 , 把一组操作看做是一个事务
原子性(要么都做要么都不做),
一致性 (完整,平衡,此消彼长)
隔离性(资源锁定, 不能被其他事务访问)
持久性(事务一旦提交,改变就是永久的)
需要注意mysql数据库引擎不同,不一定支持事务,MyISAM引擎就不支持事务
INNODB引擎才支持
那么看业务需求, 如果没有一系列操作 都要求成功, 或者是数据要保证平衡一致这类需求的话, 那么就不需要支持事务的引擎
比如, 对接收到的消息就立即存数据库, 这些数据并不需要传输给其他数据库对象, 就是说这些数据都是独立的, 需要的是记录, 那么就应该在第一时间存入数据库就好了
如, 指定数据库类型 ENGIN = INNODB DEFAULT CHARSET = utf8;
自动提交
conn.autocommit(false) #关闭,默认是关闭的
conn.commit() #正常结束事务时调用
conn.rollback() #异常结束事务时调用
conn = MySQLdb.Connect('127.0.0.1',3306,root,'123456','testdb','utf8')
cursor = conn.cursor()
sql_insert =""
sql_update = ""
sql_delete = ""
try:
cursor.execute(sql_insert)
print cursor.rowcount
cursor.execute(sql_update)
print cursor.rowcount
cursor.execute(sql_delete)
print cursor.rowcount
conn.commit()
except Exception e:
conn.rollback()
print e
finnally:
cursor.close()
conn.close()
Python 正则表达式
不引用re的话, 一般的匹配字符串方法有
调用字符串函数startswith , find(“str”)
字符串切片 后进行匹配
如
line[-2:] 表示的是最后结尾的两个字符
line[:-2] 表示的是从开头到倒数第二个字符之前的字符
line[5:] 表示第5个字符以后的字符
line[:5] 表示前5个字符
line[0] 表示第一个字符
listStr = ('imoocy', 'ye', 'yes__imooc')
for line in listStr:
if (line.startswith("imooc")) :
print(line)
if(line[-5:] == "imooc"):
print(line)
结果:
imoocy
yes__imooc
使用 re 模块
import re #导入re模块
pa = re.compile(r’imooc’)
调用compile方法得到pattern对象
则表达式写在compile参数里 , r表示后面的字符串是正则表达式
type(pa)
使用pattern对象的match方法
python里某个函数的查看帮助的方法:
help(pa.match)
Help on built-in function match:
match(...) method of _sre.SRE_Pattern instance
match(string[, pos[, endpos]]) -> match object or None.
Matches zero or more characters at the beginning of the string
返回从起始位置开始匹配的0或多个字符
pa = re.compile(r'imooc')
pa.match('hello world') #当不匹配的时候返回是空
pa.match('imooc hello world') #匹配成功的时候 会返回一个match对象
<_sre.SRE_Match object; span=(0, 5), match='imooc'>
ma = pa.match('imooc hello world')
help(ma) # 这样会输出一个树形带缩进的帮助文档
ma. # tab 两下 查看到需要帮助的方法后 , 再用help
help(ma.group)
Help on built-in function group:
group(...) method of _sre.SRE_Match instance
group([group1, ...]) -> str or tuple.
Return subgroup(s) of the match by indices or names.
For 0 returns the entire match.
group 返回匹配到的字符串, 或者是匹配的元组 tuple
span 方法 返回匹配的字符串位置
ma.string() # 返回匹配的原始字符串, 不匹配的话ma就是空, 也就不存在string了
ma = pa.match('hello world')
ma.string
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'string'
ma = pa.match('imooc hello world')
ma.string
'imooc hello world'
如果匹配的话才有match对象, match对象的re 就是其pattern对象 , 也就是match对象对应的正则表达式
ma = pa.match(‘imooc hello world’)
ma.re
输出结果:
re.compile(‘imooc’)
例子1:
pa = re.compile(r"^_.*$")
pa.match("abc") # 不能匹配成功, 返回空
pa.match("_abc") # 匹配成功返回 match对象
<_sre.SRE_Match object; span=(0, 4), match='_abc'>
pa.match("_abc").string # 访问string属性, 得到匹配的原始字符串
'_abc'
pa.match("_abc").group() # 使用group方法得到匹配的字符串
'_abc'
pa.match("_abc").re # 获取match对象所匹配的正则表达式对象
re.compile('^_.*$')
例子2:
re.compile('_').match("_test").group()
'_'
这里相当于用的都是匿名对象
compile方法返回pattern对象, 调用其的match方法, 若匹配成功返回match对象
调用match对象的group方法, 注意group方法返回的是正则表达式完全匹配的部分
比如这里正则表达式就只是一个下划线字符, 于是返回的就只是一个下划线
例子3:
re.match(r".","abc").group() #省略compile , 直接调用match的另一种方法, 第二个参数是需要检验的字符串
'a' # group() 返回匹配的部分, a匹配.
单个字符匹配 ,正则语法
. #匹配除\n以外的任意字符
[…] #匹配字符集
\d / \D #匹配数字 / 非数字
\s / \S #匹配空白 / 非空白
\w / \W #匹配一个单词字符[a-zA-Z0-9] / 非单词字符
例子4:
re.match(r"[a-z]", "abc").group() #匹配一个字符
'a'
re.match(r"\w", "what are you doing").group() #匹配一个字符
'w'
re.match(r"\[[\w]\]", "[a]").group() # 匹配成功
'[a]'
re.match(r"\[[\w]\]", "[abc]").group() # 这种匹配失败, 因为\w只能匹配一个字符
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
多个字符匹配 ,正则语法
- #匹配前一个字符0词或无限次
- #匹配前一个字符1词或无线词
? #匹配前一个字符0次或1次
{m}/{m,n} #匹配前一个字符m或n次
*? /+? /?? #匹配模式变为非贪婪(尽可能少匹配字符)
例子5:
re.match("[a-z][A-Z]", "aA") # 匹配
<_sre.SRE_Match object; span=(0, 2), match='aA'>
re.match("[a-z][A-Z]", "a") # 不匹配
re.match("[a-z][A-Z]*", "a") # 匹配, 因为"*"可以表示0个
<_sre.SRE_Match object; span=(0, 1), match='a'>
re.match("[a-z]*", "aadsfasdf").group() # 匹配
'aadsfasdf'
re.match("[A-Z][a-z]*", "Aaadsfasdf").group() # 匹配
'Aaadsfasdf'
re.match("[A-Z][a-z]*", "0aadsfasdf").group() # 不匹配因为数字开头
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
re.match("[A-Z][a-z]*", "Aaads5555fasdf").group() # 部分匹配, group匹配到数字前面部分
'Aaads'
re.match(r"[_a-zA-Z]+[\w]*","_value").group()
'_value'
re.match(r"[1-9]?[0-9]","99").group() # 使用问号, 匹配1位或两位数
'99'
re.match(r"[1-9]?[0-9]","0").group()
'0'
re.match(r"[1-9]?[0-9]","9").group()
'9'
re.match(r"[a-zA-Z0-9]{6}","abc123").group() # 匹配 使用大括号指定前面字符出现次数, 至少出现的次数
'abc123'
re.match(r"[a-zA-Z0-9]{6}","abc1234").group() # 多出现次数也能匹配, 但只匹配指定位数
'abc123'
re.match(r"[a-zA-Z0-9]{6}","abc12").group() # 少于指定次数匹配失败
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
re.match(r"[a-zA-Z0-9]{6}","abc12___").group() # 包含未指定的字符 , 不匹配
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
re.match(r"[a-zA-Z0-9]{6,10}","test12345678").group() # 匹配6-10个字符
'test123456'
re.match(r"[a-zA-Z0-9]{6,10}","test1234567891010").group() # 匹配6-10个字符 多出10个字符被忽略
'test123456'
re.match(r"[a-zA-Z0-9]{6,10}","test").group() # 少于指定的最少个数则匹配失败
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
re.match(r"[a-zA-Z0-9]{6,10}@163.com","test1234567891010@163.com").group() #匹配失败, 超过最大
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
re.match(r"[0-9][a-z]*", "1abc").group() # 星号的一般情况
'1abc'
re.match(r"[0-9][a-z]*?", "1abc").group() # 星号后加上? 关闭贪婪模式 *?最小匹配 也就是0次
'1'
re.match(r"[0-9][a-z]+", "1abc").group() # +号的一般情况
'1abc'
re.match(r"[0-9][a-z]+?", "1abc").group() # +? 最小匹配, +号最小也就是1次
'1a'
边界匹配
^ 匹配字符串开头
$ 匹配字符串结尾
\A / \Z 指定字符串必须出现在开头/结尾
re.match(r"[_\w]{6,10}@163.com", "a_bc1234@163.com00000") # 匹配, 因为没有指定边界, 和我们需求不一致
<_sre.SRE_Match object; span=(0, 16), match='a_bc1234@163.com'>
ma = re.match(r"[_\w]{6,10}@163.com$", "a_bc1234@163.com00000") # 不匹配, 这样就达到目的
type(ma)
<class 'NoneType'>
re.match(r"^[_\w]{6,10}@163.com$", "a_bc1234@163.com") # 指定开头
<_sre.SRE_Match object; span=(0, 16), match='a_bc1234@163.com'>
re.match(r"\Afrom[\w]*", "from123456").group() # \A 指定以什么开头
'from123456'
re.match(r"\Afrom[\w]*000\Z", "from1234560").group() # 不匹配, \Z 指定以000结尾
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
re.match(r"\Afrom[\w]*000\Z", "from123456000").group() #匹配
'from123456000'
分组匹配
| 匹配左右任意一个表达式
(ab) 括号中表达式作为一个分组
\number 引用编号为num匹配到的字符串
(?p) 给分组起一个别名
(?p=name) 引用别名为name的分组匹配字符串
re.match(r"abc|d","abc") # 匹配 , abc 或 d
<_sre.SRE_Match object; span=(0, 3), match='abc'>
re.match(r"abc|d","d") # 匹配, abc 或 d
<_sre.SRE_Match object; span=(0, 1), match='d'>
re.match(r"[1-9]?\d$", "19") # 匹配 0-99
<_sre.SRE_Match object; span=(0, 2), match='19'>
re.match(r"[1-9]?\d$", "0") # 匹配 0-99
<_sre.SRE_Match object; span=(0, 1), match='0'>
re.match(r"[1-9]?\d$|100", "100") # 匹配 0-100
re.match(r"^[\w]{6,10}@(163|126|sina|qq).com$","abc123@126.com") # 使用(a|b|c|c) , 既匹配a表达式也匹配b,c,d表达式
<_sre.SRE_Match object; span=(0, 14), match='abc123@126.com'>
re.match(r"^[\w]{6,10}@(163|126|sina|qq).com$","abc123@163.com") # 使用(a|b|c|c) , 既匹配a表达式也匹配b,c,d表达式
<_sre.SRE_Match object; span=(0, 14), match='abc123@163.com'>
re.match(r"<([\w]+>)","<book>") # 先写好正则表达式匹配, 然后把需要读取的部分用括号扩起来,
<_sre.SRE_Match object; span=(0, 6), match='<book>'> #可以使用多个括号 , 这样就有多个分组, groups()可以查看所有分组
re.match(r"<([\w]+>)\1","<book>book>") # 使用\1 来引用括号中匹配的分组
<_sre.SRE_Match object; span=(0, 11), match='<book>book>'>
# re.match(r'<([\w]+>)[\w]+</\1',"<book>python</book>") # 一段xml元素的匹配, 使用\1 , \2 这样的方式来访问分组
<_sre.SRE_Match object; span=(0, 19), match='<book>python</book>'>
# re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)',"<book>python</book>")
<_sre.SRE_Match object; span=(0, 19), match='<book>python</book>'>
# 为括号中的分组取别名, (?P<groupname>正则)
# 括号里以?P<groupname> 开头, 后面匹配的部分, 用(?P=groupname) 来访问分组
re 模块中其他常用方法
search 方法
re.search(r"\d+", "hours=1000")
<_sre.SRE_Match object; span=(6, 10), match='1000'>
re.search(r"\d+", "hours=1000").group()
'1000'
findall
re.search(r"\d+", "hours=770, c++=100, java=90").group() # search 只能返回第一个匹配
'770'
re.findall(r"\d+", "hours=770, c++=100, java=90").group() # findall返回的不是match对象, 所以没有group方法
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'list' object has no attribute 'group'
re.findall(r"\d+", "hours=770, c++=100, java=90").groups() # 当然也没有groups方法
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'list' object has no attribute 'groups'
re.findall(r"\d+", "hours=770, c++=100, java=90") # findall直接返回列表
['770', '100', '90']
info = re.findall(r"\d+", "hours=770, c++=100, java=90")
info
['770', '100', '90']
sum(int (x) for x in info)
960
sub方法 替换字符串
re.sub(r"\d+", "1001", "java=100") # 一般方式
'java=1001'
def add1(match): # 定义一个函数来替换
val = int( match.group()) # 对字符串转换为数字才能运算
return str(val + 1) # 这里注意返回值, 需要转换为字符串才能打印
re.sub(r"\d+",add1 ,"java = 100") # 调用的时候匹配的话, 会自动发送match对象给函数
'java = 101' # 实现了匹配的数字部分加1
split 分割字符串
re.split(r":| |,","lecture:python java c, c++") # 可以指定多种分隔符来分割字符串
['lecture', 'python', 'java', 'c', '', 'c++']