文件读取,异常及序列化
#f = open('文件路径','操作模式',encoding='编码')
f = open('data/背影.txt','r',encoding='utf-8')
文件操作模式
符号 | 含义 |
---|---|
r | 读取(默认) |
w | 写入(会覆盖文件中的内容) |
a | 追加(在文件末尾追加内容) |
b | 二进制模式(读写图片等) |
+ | 既可以读也可以写 |
def main():
f = None
try:
f = open('data/背影.txt','r',encoding='utf-8')
for line in f:
print(line.strip())
except FileNotFoundError:
print('无法找到指定文件')
except LookupError:
print('指定了未知编码')
except UnicodeDecodeError:
print('解码错误')
finally:
if f:
f.close()
def main():
try:
with open('data/背影.txt','r',encoding='utf-8') as f:
for line in f:
print(line.strip()
except FileNotFoundError:
print('无法找到指定文件')
except LookupError:
print('指定了未知编码')
except UnicodeDecodeError:
print('解码错误')
if __name__=='__main__':
main()
finally是总执行代码,无论是否发生异常,发生什么异常。因此,finally适合用来释放外部资源。上述代码关闭文件对象释放资源,也可以用用with关键字指定文件的上下文环境,当离开文件的上下文环境释放文件资源。
二进制模式读写图片资源
def main():
fr = None
fw = None
try:
fr = open('dog.jpg','rb')
data = f.read()
fw = open('dog_copy.jpg','wb')
fw.write(data)
except FileNotFoundError as e:
print('指定的文件无法打开.')
except IOError as e:
print('读写文件时出现错误.')
finally:
if fr:
fr.close()
if fw:
fw.close()
print('程序执行结束.')
if __name__=='__main__':
main()
序列化
在python中用json模块将字典或列表以json格式存储在文件中
dump 将python对象按照json格式序列化到文件中
dumps 将python对象处理成json格式的字符串
load 将文件中的json数据反序列化成python对象
loads 将字符串内容发序列化成python对象
import json
def main():
mydict = {
'name':'liwei',
'age':28,
'school':'ISTIC',
'homeMenber':{'father':'liDaZui',
'mother':'TongXiangYu',
'brother':'BaiZhanTang'},
'favor':['basketball','pingpangBall','running'],
'friend':[{'name':'ZXL','age':29},{'name':'WDR','age':28}]
}
fr = None
try:
fr = open('mydict.txt','w',encoding='utf-8')
json.dump(mydict ,fr)
except Exception as e:
print(e.messege)
finally:
if fr:
fr.close()
if __name__=='__main__':
main()
正则表达式
正则表达式是一个工具,它定义了字符串匹配模式,
符号 | 解释 | 示例 | 说明 |
---|---|---|---|
. | 匹配任意字符 | b.t | 可以匹配bat / but / b#t / b1t等 |
\w | 匹配字母/数字/下划线 | b\wt | 可以匹配bat / b1t / b_t等但不能匹配b#t |
\s | 匹配空白字符(包括\r、\n、\t等) | love\syou | 可以匹配love you |
\d | 匹配数字 | \d\d | 可以匹配01 / 23 / 99等 |
\b | 匹配单词的边界 | \bThe\b | |
^ | 匹配字符串的开始 | ^The | 可以匹配The开头的字符串 |
$ | 匹配字符串的结束 | .exe$ | 可以匹配.exe结尾的字符串 |
\W | 匹配非字母/数字/下划线 | b\Wt | 可以匹配b#t / b@t等但不能匹配but / b1t / b_t等 |
\S | 匹配非空白字符 | love\Syou | 可以匹配love#you等但不能匹配love you |
\D | 匹配非数字 | \d\D | 可以匹配9a / 3# / 0F等 |
\B | 匹配非单词边界 | \Bio\B | |
[] | 匹配来自字符集的任意单一字符 | [aeiou] | 可以匹配任一元音字母字符 |
[^] | 匹配不在字符集中的任意单一字符 | [^aeiou] | 可以匹配任一非元音字母字符 |
* | 匹配0次或多次 | \w* | |
+ | 匹配1次或多次 | \w+ | |
? | 匹配0次或1次 | \w? | |
{N} | 匹配N次 | \w{3} | |
{M,} | 匹配至少M次 | \w{3,} | |
{M,N} | 匹配至少M次至多N次 | \w{3,6} | |
(?Pexp) | 匹配exp,并捕获文本到名称为value的组里 | ||
*? | 重复任意次,但尽可能少重复 | ||
+? | 重复1次或更多次,但尽可能少重复 | ||
?? | 重复0次或1次,但尽可能少重复 |
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?
import re
def match_double(matched):
value = int(matched.group('name'))
return str(value*2)
str_test = 'ABC123GH48JK9867'
print(re.sub('(?P<name>\d+)',match_double,str_test))
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
正则表达式修饰符 | 含义 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
re.match(pattern, string, flags=0)
pattern:正则表达式
string:字符串
flag:正则表达式修饰符,标志位
re.match 尝试从字符串的起始位置匹配一个模式,匹配成功返回对象,否则返回None
re.search(pattern, string, flags=0)
re.match 尝试从字符串匹配一个模式,匹配成功返回对象,否则返回None
re.match() 和re.search()区别,re.match从字符串的起始位置匹配.
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
.group(num=0) ,无参数则匹配的正则表达式的字符串,num = 1,返回对应元组
.groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号
import re
line = "Cats are smarter than dogs"
reObject = re.search('(.*) are (.*?) .*')',line,flags=re.I)
print(reObject) #<re.Match object; span=(0, 26), match='Cats are smarter than dogs'>
print(reObject.group()) #Cats are smarter than dogs
print(reObject.group(1))#Cats
print(reObject.group(2))#smarter
print(reObject.groups())#('Cats', 'smarter')
re.findall(pattern, string, flags=0)
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有
import re
line = ‘run88oob123google456’
matlst = re.findall(’\d+’,line)
pattern =re.compile( ‘\d+’)
matlsttwo = pattern.findall(line ,0,10)
print(matlst)
print(matlsttwo )
re.sub(pattern, repl, string, count=0, flags=0)
用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数.