• 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}
    right:{0:>6}
    center:{0:+^6}' 
    fs.format('hi') 
    #left:hi    
    right:    hi
    center:++hi++
    
    fs='space padding:{:=6}
    * padding:{:*=6}' 
    fs.format(-2, -3) 
    #space padding:-    2
    * padding:-****3    
    

    4、参数三:数字符号

    A) 语法: {n[转换标识符]:[填充字符][对齐符号][数字符号][最小长度][数字进制]}

    B)使用

    符号说明
    + 强制显示数字的正负号
    - 数字为负数时显示负号,数字为正数时不显示符号
    space 数字为负数时显示负号,数字为正数时在数字前添加空格
    fs='{0:+}
    {0:-}
    {0: }' 
    fs.format(78) 		
    #result: '+78
    78
     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=" " 指定行分隔符为 或 或

    1、读文件

    • 注:读入行时也会读入 换行符,可以使用字符串函数strip去除

    • 打开文件

      • 绝对路径

        #绝对路径
        file=open(filename[,mode,encoding=?])
        file=open("D:
        ews.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
      ews.txt","w+",encoding="utf-8") as file
      
    • 按字符写入

      • 参数必须是str
      #覆盖写入
      with open("D:data
      ews.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'xabxcdef')
              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")
    
  • 相关阅读:
    服务命令Linux安装配置apache
    枚举参考hdu2062Subset sequence
    异常选择struts2文件上传产生Source 'xxxx.tmp' does not exist
    序列插入常用排序算法 总结
    代码nullMerge two sorted linked lists
    下载文件win8mp3下载
    希望判断创造、改变世界的基因
    qemulauncher:图形化的QEMU启动器
    Virtual Memory I: the problem
    HIGHMEM
  • 原文地址:https://www.cnblogs.com/whoyoung/p/11424177.html
Copyright © 2020-2023  润新知