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")

 

posted @ 2019-08-28 15:09  WhoYoung  阅读(393)  评论(0编辑  收藏  举报