zoukankan      html  css  js  c++  java
  • 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")
    
  • 相关阅读:
    Proj THUDBFuzz Paper Reading: The Art, Science, and Engineering of Fuzzing: A Survey
    Proj THUDBFuzz Paper Reading: A systematic review of fuzzing based on machine learning techniques
    9.3 付费代理的使用
    11.1 Charles 的使用
    第十一章 APP 的爬取
    10.2 Cookies 池的搭建
    10.1 模拟登录并爬取 GitHub
    11.5 Appium 爬取微信朋友圈
    11.4 Appium 的基本使用
    11.3 mitmdump 爬取 “得到” App 电子书信息
  • 原文地址:https://www.cnblogs.com/whoyoung/p/11424177.html
Copyright © 2011-2022 走看看