Python学习笔记(三)
一、格式化字符串
1、基本语法
2、参数一:转换标识符
3、参数二:长度与对齐
4、参数三:数字符号
5、参数四:数字进制符
6、参数五:小数显示精度及形式
7、日期格式化参数
二、读写文件
1、读文件
2、With语句
3、写文件
三、CSV文件读入
1、读CSV
2、写CSV
四、Json读写
1、序列化为json (dump)
2、json反序列化 (load)
五、XML 读写
1、数据结构
2、遍历
3、查找遍历
4、节点操作
5、写入
6、XMLPullParser
六、异常
1、主动抛出 raise
2、捕获异常
一、格式化字符串
-
格式化字符串
-
格式化字符串是一个快速生成指定模式字符串的模板
- 使用%格式化字符串的方式(老版)
- 使用format格式字符串的方式(新版)
-
1、基本语法
-
A)语法:
{n|somenames[转换标识符]:[填充字符][对齐符号][数字符号][最小长度][数字进制|小数精度及形式]}
-
数字符号 + 最小长度 + 数字进制 就是C中的常用格式化方法
-
使用{n}或{somenames}作为字符串模板的占位符
- 位置参数
- 关键字参数
-
#位置参数
fs='{1} name is {0}' #指定参数的下标
fs.format('Raymond', 'my') #res:my name is Raymond
fs='{} name is {}' #不指定位置和名字,依次填入
fs.format('my', 'Raymond') #res:my name is Raymond
fs='{0.path}' #对零号下标的类对象参数的成员变量或方法的引用
fs.format(sys)
fs.format(os)
fs='{0[1]} {0[0]}' #零号下标的集合对象的引用
fs.format(list('abc'))
#关键字参数
fs='{whose} name is {name}'
fs.format(name='Raymond',whose='my') #res:my name is Raymond
fs='{symbols[1]} {symbols[0]}'
fs.format(symbols=list('abc')) #res: b a
——————————————————————————————————————————————————
2、参数一:转换标识符
标识符 | 对应函数 | 函数说明 |
---|---|---|
!s | str() | 返回字符串 |
!r | repr() | 返回供解释器读取的形式 |
!a | ascii() | 返回一个表示对象的字符串, 但是对于字符串中的非 ASCII 字符则返回通过 repr() 函数使用 \x, \u 或 \U 编码的字符 |
用法: 直接嵌入到占位符的{}括号内部,在参数名或参数位置下标之后
——————————————————————————————————————————————————
3、参数二:长度与对齐
A)语法:
- {n[转换标识符]:[填充字符][对齐符号][数字符号][最小长度][小数精度及形式]}
B)使用:
-
数字对齐与字符串对齐方式不同
- 数字对齐,默认右对齐
- 非数字对齐,默认左对齐
- 默认填充都是空格
符号 | 说明 |
---|---|
< | 左顶格,长度不足时在字符串右侧填充空格(默认情况下非数字对象的对齐方式) |
> | 右顶格,长度不足时在字符串左侧填充空格(默认情况下数字对象的对齐方式) |
= | 符号顶格(右顶格),长度不足时在在数字对象的符号和数字间填充字符(默认填充空格) |
^ | 居中,长度不足时,使字符串居中(左右两侧填充空格) |
demo实例
fs='{0!a:>>20}' #参数转为字符串!a ,第一个>以符号`>`填充空白处,第二个>代表右顶格对齐
fs.format(123456789)
# Out[45]: '>>>>>>>>>>>123456789'
fs='left:{0:<6}\nright:{0:>6}\ncenter:{0:+^6}'
fs.format('hi')
#left:hi \nright: hi\ncenter:++hi++
fs='space padding:{:=6}\n* padding:{:*=6}'
fs.format(-2, -3)
#space padding:- 2\n* padding:-****3
4、参数三:数字符号
A) 语法: {n[转换标识符]:[填充字符][对齐符号][数字符号][最小长度][数字进制]}
B)使用:
符号 | 说明 |
---|---|
+ | 强制显示数字的正负号 |
- | 数字为负数时显示负号,数字为正数时不显示符号 |
space | 数字为负数时显示负号,数字为正数时在数字前添加空格 |
fs='{0:+}\n{0:-}\n{0: }'
fs.format(78)
#result: '+78\n78\n 78'
5、参数四:数字进制符
符号 | 说明 |
---|---|
b | 将输入的数值转换成二进制格式 |
c | 将输入的数值转换成对应的unicode字符 |
d | 将输入的数值转换成十进制格式 |
o | 将输入的数值转换成八进制格式 |
x | 将输入的数值转换成十六进制格式,字母小写 |
X | 将输入的数值转换成十六进制格式,字母大写 |
n | 将输入的数值转换成十进制格式,但使用当前系统环境的数字分隔符 |
None | 将输入的数值转换成十进制格式 |
# | 插入进制标识符 |
6、参数五:小数显示精度及形式
- 本限制符与数字进制符不兼容,二者只择其一
- 使用
.3f
类似的形式指定显示形式的精度
符号 | 说明 |
---|---|
e | 将输入的数值转换成科学计数法的表现形式,默认精度为6 |
E | 与e相同,但使用大写E,默认精度为6 |
f | 将输入的数值转换成小数的形式,默认精度为6 |
F | 与f相同,但将nan转换成NAN,inf转换为INF |
g | 将输入的数值转换fixed-point格式输出. 当数值特别大的时候, 用幂形式输出,默认6位 |
G | 与g相同,使用字母大写,fix-point格式即整数+小数位共6位 |
n | 与g相同,但使用当前系统环境的数字分隔符 |
% | 将输入的数值转换成百分数. 将数值乘以100然后以fixed-point('f')格式打印, 值后面会有一个百分号 |
7、日期格式化参数
A)使用方法
#首先要有日期时间类
import datetime
datetime.datetime(年数,月数,日数,时数,分数,秒数)
d = datetime.datetime(2015, 11, 12, 13, 14, 15)
#格式字符串为datetime类
'{:%Y-%m-%d %H:%M:%S}'.format(d)
#datetime的strptime解析字符串为datetime类
time=datetime.datetime.strptime('2015-11-12 13:14:15','%Y-%m-%d %H:%M:%S')
print(time)
type(time)
#datetime的strftime解析日期类为字符串
B)详细参数
符号 | 说明 | 示例 |
---|---|---|
%a | 使用简称显示星期信息 | Sun, Mon, ..., Sat |
%A | 使用全称显示星期信息 | Sunday, Monday, ..., Saturday |
%w | 使用数字显示星期信息 | 0, 1, ..., 6 |
%d | 使用数字显示日期信息,用0补位 | 01, 02, ..., 31 |
%b | 使用简称显示月份信息 | Jan, Feb, ..., Dec |
%B | 使用全称显示月份信息 | January, February, ..., December |
%m | 使用数字显示月份信息,用0补位 | 01, 02, ..., 12 |
%y | 使用2位数字显示年份,用0补位 | 00, 01, ..., 99 |
%Y | 使用4位数字显示年份,用0补位 | 0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
%H | 使用24小时制显示小时,用0补位 | 00, 01, ..., 23 |
%I | 使用12小时制显示小时,用0补位 | 01, 02, ..., 12 |
%p | 使用AM表示上午,PM表示下午 | AM, PM |
%M | 使用数字显示分,用0补位 | 00, 01, ..., 59 |
符号 | 说明 | 示例 |
---|---|---|
%S | 使用数字显示秒,用0补位 | 00, 01, ..., 59 |
%f | 使用数字显示毫秒,用0补位 | 000000, 000001, ..., 999999 |
%z | 相对UTC的偏移+HHMM or -HHMM | +0000, -0400, +1030 |
%Z | 显示时区的名称 | UTC, EST, CST |
%j | 使用数字显示一年中的天数,用0补位 | 001, 002, ..., 366 |
%U | 使用数字显示一年中的星期数(星期日是一周的开始),用0补位 | 00, 01, ..., 53 |
%W | 使用数字显示一年中的星期数(星期一是一周的开始),用0补位 | 00, 01, ..., 53 |
%c | 根据当前系统显示周月日时分秒年信息 | Tue Aug 16 21:30:00 1988 |
%x | 根据当前系统显示月日年信息 | 08/16/88 (None); 08/16/1988 (en_US); |
%X | 根据当前系统显示时分秒信息 | 21:30:00 |
%% | 显示字符% | % |
二、读写文件
- 参数newline="\n" 指定行分隔符为\n或\r或\r\n
1、读文件
-
注:读入行时也会读入\n换行符,可以使用字符串函数strip去除
-
打开文件
-
绝对路径
#绝对路径 file=open(filename[,mode,encoding=?]) file=open("D:\news.txt",'r',encoding='utf-8')
-
相对路径
with open(filename,mode,encoding) as file: #相对路径,同linux file=open("./news.txt") #当前工程文件同目录下
-
-
读取文件
-
按字节读入
file.read(5) #参数5,读入5个字节 file.read() #无参,一次性读完,返回一个str file.read() #此处无数据,因为文件指针已到结束位置
-
按行读入
file.readline() #读一行,返回一个str file.readlines() #按行读取全部,返回一个行列表
-
遍历文件读入
#推荐使用:遍历文件 for line in file: print(line)
-
-
关闭文件
file.close
2、With语句
-
自动释放文件资源
-
解决异常退出和遗忘关闭时的资源释放问题
with open(filename) as file: line = file.readline() # read a line lines = file.readlines() # read all lines,return a list for line in file: print(line) # read line by line #缩进外自动释放了file
3、写文件
-
打开文件
with open("D:\data\news.txt","w+",encoding="utf-8") as file
-
按字符写入
- 参数必须是str
#覆盖写入 with open("D:\data\news.txt","w+",encoding="utf-8") as file file.write("i'm huyang") file.flush #缓冲区写入
-
按字节写入
#二进制追加写入 with open("D:/data/news.txt",'ab+') as file: file.write(b'\xab\xcdef') file.writelines([b'abc',b'xyz']) #使用b转换为二进制
-
按行写入
- 参数可以是一个可迭代对象,如列表
#自动迭代分行写入文档 with open("D:/data/news.txt",'a+') as file: lst=[1,2,3,4] file.writelines(lst)
三、CSV文件读入
import csv
#使用help命令获取API手册
1、读CSV
-
reader
- 以每一行为一个列表的形式读取
- 返回一个可迭代对象,元素为列表,列表元素即为值
with open(filename, newline='') as file: reader = csv.reader(file) #返回一个可迭代对象,元素为列表 for row in reader: print(row)
-
DictReader
- 以每一行为一个字典读取
- 返回一个可迭代对象,元素为列表,列表元素为元组,元组结构为:(字段名,值)
- 字典以首行的列名为key,每行的对应列值为value
with open(filename, newline='') as file:#newline设置不读入换行符 reader = csv.DictReader(file) # for row in reader: print(row)
2、写CSV
-
csv.witer
- 无首行,直接按行写入
with open(filename, 'w', newline='') as file: #newlines='' 结束时不创建新行 writer = csv.writer(file) writer.writerow(('1', 2, 3.0, 'abcd')) #写入的数据被pack包装为元组
-
csv.DictWriter
- 首行需使用writeheader()声明
with open(filename, 'w', newline='') as file: writer = csv.DictWriter(file, fieldnames=['F1', 'F2']) #声明字段名 writer.writeheader() #声明要写首行 writer.writerow({'F1':1, 'F2':2}) #写入的数据需包装成dict
四、Json读写
import json
方法 | 描述 |
---|---|
json.dump() | 将Python对象编码存入.json文件对象中 |
json.dumps() | 将Python对象编码成.json字符串 |
json.load() | 将.json文件对象解析成Python对象 |
json.loads() | 将已编码的json字符串解码成Python对象 |
1、序列化为json (dump)
-
转换为json格式的字符串,dumps
data= ['foo',{'bar': ('baz', None, 1.0, 2)},True, False] jsonData=json.dumps(data) # encode to string
-
转换为json文件,dump
- 参数必须是文件对象,而不是路径
data= ['foo',{'bar': ('baz', None, 1.0, 2)},True, False] with open('data.json', 'w') as f: json.dump(data,f) # encode to file
2、json反序列化 (load)
-
json格式的字符串转换为列表,loads
jsonData = '["foo", {"bar": ["baz", null, 1.0, 2]}, true, false]' pythonData=json.loads(jsonData) # decode from string
-
json文件反序列化为列表,load
- 参数必须是文件对象
with open('data.json') as f: pythonData = json.load(f) # decode from file
五、XML 读写
- 有C语言版本和Python版本
try:
import xml.etree.cElementTree as et # c implementation
except ImportError:
import xml.etree.ElementTree as et # python implementation
基本语法
1、数据结构
- 根节点、父节点、子节点、当前节点
- tag-标签名(标签名) 字符串str
- attrib-属性(标签属性) 字典dict
- text-内容(标签内容)字符串str
2、遍历
-
获取根节点
root = et.fromstring(xmlString) #字符串源构造对象 root = et.parse('demo.xml').getroot() #文档源构造对象
-
遍历节点
#遍历的是直接子节点 for child in root: print(child.tag)
3、查找遍历
-
指定标签名遍历子节点
- 直接子节点中查找,findall
for child in root.findall('lesson'): print(child.attrib['id']) #获取id属性
- 子节点迭代查找,iter
for child in root.iter('topic'): print(child.text) for child in root.iter("*"): print(child.tag) #从上往下,从外到内,遍历所有节点
-
索引遍历子节点
child=root[1][0]
4、节点操作
-
创建新的节点
newNode = et.Element('topic') #生成新Element对象 newNode.set('id', '1') # 设置属性名及属性值 newNode.text='人工智能' #设置标签内容
-
父节点下新建子节点
newNode = et.SubElement(parent, 'TagName')
-
父节点下插入新节点
parent.insert(index, newNode) #index 0开始
-
父节点尾部插入子节点
parent.append(newNode)
-
删除父节点的子节点
#通过索引删除 del parent[0] #通过节点对象删除 parent.remove(child)
5、写入
-
xml转字符串
str=et.dump(node)
-
写入文件
tree = et.ElementTree(node) with open('node.xml', 'w') as file: tree.write(file, encoding="unicode")
6、XMLPullParser
-
一个用于解析xml文档的第三方库
-
特点
- 使用CPython实现,解析速度快
- 使用xpath语句,能够灵活提取页面内容
- 使用路径表达式来选取 XML 文档中的节点或节点集
XPATH语法
表达式 | 描述 |
---|---|
nodename | 选取的节点名 |
name1/name2 | 选取name1下的name2节点 |
/ | 从根节点选取 |
// | 选取所有符合条件的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
[@attrib] | 选取所有包含指定属性的节点 |
[@attrib='value'] | 选取所有指定属性值为value的节点 |
[tag] | 所有子节点包含指定节点名的节点 |
[position] | 通过索引选取节点 |
-
载入xml文件
import io from lxml import etree as et # choose lxml for pretty print with open("./baidu_rss.xml",'rb') as file: bio=io.BytesIO(file.read()) #使用io工具读入二进制的数据 # remove_blank_text=True will reset indent for pretty print to work properly 重置分割符,方便XMLPullParser解析 root=et.parse(bio, et.XMLParser(remove_blank_text=True)).getroot() bio.close() print(et.tostring(root, pretty_print=True, encoding='unicode'))
-
查找指定节点
xpath语法
- item标签下的title标签
for el in root.findall('.//item/title'): #.自身节点 //搜索 item/title 层级关系 print(et.tostring(el))
- 子节点中有pubDate的标签
for el in root.findall('.//*[@location]'): print(et.tostring(el))
- 子节点中有location的标签
for el in root.findall('.//*[@location]'): print(et.tostring(el))
六、异常
1、主动抛出 raise
def func(param):
raise exceptionType(args)
2、捕获异常
try:
body code
except NameError as ex1:
exception1 handling code
except exceptionType2 as ex2:
exception2 handling code
except: #可缺省类型
default exception handling code
else:
else code #没发生异常时
finally:
finally code #不管有没有异常,最终必须执行
demo实例
a=0
b=10
try :
b/a
except [ZeroDivisionError as zs ]: #可缺省异常类型
print("EROR")