• python笔记


                        python笔记 - day7                       

     参考:

    http://www.cnblogs.com/wupeiqi/articles/5501365.html

    面向对象,初级篇:
     

    大纲:

    configparser模块
    XML模块
    shutil模块以及压缩包处理
    subprocess模块
    面向对象学习
     

    configparser:

    模块解析:configparser用于处理特定格式的文件,其本质上是利用open来操作文件。

    # 注释1
    ;  注释2
     
    [section1] # 节点
    k1 = v1    # 值
    k2:v2       # 值
     
    [section2] # 节点
    k1 = v1    # 值
    
    configparser只能编辑这种格式的配置文件,例如samba
    配置文件示例

    1.获取所有节点

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
    ret = config.sections()
    print(ret)
    

     2、获取指定节点下所有的键值对

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
    ret = config.items('section1')
    print(ret)
    

    3、获取指定节点下所有的建

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
    ret = config.options('section1')
    print(ret)
    

     4、获取指定节点下指定key的值

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
     
     
    v = config.get('section1', 'k1')
    # v = config.getint('section1', 'k1')
    # v = config.getfloat('section1', 'k1')
    # v = config.getboolean('section1', 'k1')
     
    print(v)
    

    5、检查、删除、添加节点

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
     
     
    # 检查
    has_sec = config.has_section('section1')
    print(has_sec)
     
    # 添加节点
    config.add_section("SEC_1")
    config.write(open('xxxooo', 'w'))
     
    # 删除节点
    config.remove_section("SEC_1")
    config.write(open('xxxooo', 'w'))
    

     6、检查、删除、设置指定组内的键值对

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
     
    # 检查
    has_opt = config.has_option('section1', 'k1')
    print(has_opt)
     
    # 删除
    config.remove_option('section1', 'k1')
    config.write(open('xxxooo', 'w'))
     
    # 设置
    config.set('section1', 'k10', "123")
    config.write(open('xxxooo', 'w'))
    

     XML:

    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2023</year>
            <gdppc>141100</gdppc>
            <neighbor direction="E" name="Austria" />
            <neighbor direction="W" name="Switzerland" />
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2026</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia" />
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year>2026</year>
            <gdppc>13600</gdppc>
            <neighbor direction="W" name="Costa Rica" />
            <neighbor direction="E" name="Colombia" />
        </country>
    </data>
    XML文件
    from xml.etree import ElementTree as ET
    
    # 直接解析xml文件
    tree = ET.parse('xx.xml')
    
    #获取到所有节点
    root = tree.getroot()
    print(root.tag)
    from xml.etree import ElementTree as ET
    
    # 直接解析xml文件
    tree = ET.parse('xx.xml')
    
    #获取到所有节点
    root = tree.getroot()
    
    for child in root:
    # 遍历XML文档的第二层
        print(child.tag,child.attrib)
        #获取根节点名,属性名
        for grandchild in child:
        # 遍历XML文档的第三层
            print(grandchild.tag,grandchild.text)
            #获取根节点名下的节点名,和内容

    修改,删除,保存文件操作:

    from xml.etree import ElementTree as ET
    
    # 直接解析xml文件
    tree = ET.parse('xx.xml')
    
    # 获取xml文件的根节点
    root = tree.getroot()
    print(root.tag)     #获取顶层标签
    for node in root.iter('year'):
        new_year = int(node.text) + 1
        # 将year节点中的内容自增一
        node.text = str(new_year)
    
        # 设置属性
        node.set('name','alex')
        node.set('age','18')
        # 删除属性
        # del node.attrib['name']
    
    #保存文件
    tree.write("newxx.xml",encoding='utf-8')

    创建XML文档

    from xml.etree import ElementTree as ET
    
    
    # 创建根节点
    root = ET.Element("famliy")
    
    
    # 创建节点大儿子
    son1 = ET.Element('son', {'name': '儿1'})
    # 创建小儿子
    son2 = ET.Element('son', {"name": '儿2'})
    
    # 在大儿子中创建两个孙子
    grandson1 = ET.Element('grandson', {'name': '儿11'})
    grandson2 = ET.Element('grandson', {'name': '儿12'})
    son1.append(grandson1)
    son1.append(grandson2)
    
    
    # 把儿子添加到根节点中
    root.append(son1)
    root.append(son1)
    
    tree = ET.ElementTree(root)
    tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
    
    创建方式(一)
    创建XML方法一:
    from xml.etree import ElementTree as ET
    
    # 创建根节点
    root = ET.Element("famliy")
    
    
    # 创建大儿子
    # son1 = ET.Element('son', {'name': '儿1'})
    son1 = root.makeelement('son', {'name': '儿1'})
    # 创建小儿子
    # son2 = ET.Element('son', {"name": '儿2'})
    son2 = root.makeelement('son', {"name": '儿2'})
    
    # 在大儿子中创建两个孙子
    # grandson1 = ET.Element('grandson', {'name': '儿11'})
    grandson1 = son1.makeelement('grandson', {'name': '儿11'})
    # grandson2 = ET.Element('grandson', {'name': '儿12'})
    grandson2 = son1.makeelement('grandson', {'name': '儿12'})
    
    son1.append(grandson1)
    son1.append(grandson2)
    
    
    # 把儿子添加到根节点中
    root.append(son1)
    root.append(son1)
    
    tree = ET.ElementTree(root)
    tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
    
    创建方式(二)
    创建XML方法二:
    from xml.etree import ElementTree as ET
    
    
    # 创建根节点
    root = ET.Element("famliy")
    
    
    # 创建节点大儿子
    son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
    # 创建小儿子
    son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})
    
    # 在大儿子中创建一个孙子
    grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
    grandson1.text = '孙子'
    
    
    et = ET.ElementTree(root)  #生成文档对象
    et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
    
    创建方式(三)
    创建XML方法三:

    由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:

    from xml.etree import ElementTree as ET
    from xml.dom import minidom
    
    
    def prettify(elem):
        """将节点转换成字符串,并添加缩进。
        """
        rough_string = ET.tostring(elem, 'utf-8')
        reparsed = minidom.parseString(rough_string)
        return reparsed.toprettyxml(indent="	")
    
    # 创建根节点
    root = ET.Element("famliy")
    
    
    # 创建大儿子
    # son1 = ET.Element('son', {'name': '儿1'})
    son1 = root.makeelement('son', {'name': '儿1'})
    # 创建小儿子
    # son2 = ET.Element('son', {"name": '儿2'})
    son2 = root.makeelement('son', {"name": '儿2'})
    
    # 在大儿子中创建两个孙子
    # grandson1 = ET.Element('grandson', {'name': '儿11'})
    grandson1 = son1.makeelement('grandson', {'name': '儿11'})
    # grandson2 = ET.Element('grandson', {'name': '儿12'})
    grandson2 = son1.makeelement('grandson', {'name': '儿12'})
    
    son1.append(grandson1)
    son1.append(grandson2)
    
    
    # 把儿子添加到根节点中
    root.append(son1)
    root.append(son1)
    
    
    raw_str = prettify(root)
    
    f = open("xxxoo.xml",'w',encoding='utf-8')
    f.write(raw_str)
    f.close()
    缩进保存方法:

     zipfile,压缩,解压缩文件:

    ZIP

    import zipfile
    
    #把文件“ooo.xml,newxx.xml”打包成laxi.zip文件
    z = zipfile.ZipFile('laxi.zip','w')
    z.write('ooo.xml')
    z.write('newxx.xml')
    z.close()
    
    #把t1.py文件,追加打包到laxi.zip文件中
    z = zipfile.ZipFile('laxi.zip','a')
    z.write('t1.py')
    z.close()
    
    #解压laxi.zip这个包文件
    z = zipfile.ZipFile('laxi.zip','r')
    z.extract()
    z.close()
    
    #单独把“ooo.xml”文件解压出来
    z = zipfile.ZipFile('laxi.zip','r')
    z.extract('ooo.xml')
    
    #打印出来“laxi.zip”压缩包中,打包了哪些文件
    z = zipfile.ZipFile('laxi.zip','r')
    for item in z.namelist():
        print(item,type(item))

    tarfile

    import tarfile
    
    #把“t1.py重命名成t1bak.py”
    #把“t2.py重命名成t2bak.py”
    #然后把这两个文件打包成your.tar文件
    tar = tarfile.open('your.tar','w')
    tar.add('t1.py',arcname='t1bak.py')
    tar.add('t2.py',arcname='t2bak.py')
    tar.close()
    
    #把t1.py文件重命名后追加打包到your.tar文件中
    tar = tarfile.open('your.tar','a')
    tar.add('t1.py',arcname='t3bak.py')
    tar.close()
    
    #解压your.tar这个文件
    tar = tarfile.open('your.tar','r')
    tar.extractall()
    tar.close()
    
    #只解压t1bak.py这个文件
    tar = tarfile.open('your.tar','r')
    tar.extract('t1bak.py')
    tar.close()
    
    #打印出your.tar包中的所有文件
    tar = tarfile.open('your.tar','r')
    for item in tar.getmembers():
        print(item)

     subprocess执行系统命令:

    shell=False传列表,shell等于True传字符串

    call 

    执行命令,返回状态码

    ret = subprocess.call(["ls", "-l"], shell=False)
    ret = subprocess.call("ls -l", shell=True)
    

    check_call

    执行命令,如果执行状态码是 0 ,则返回0,否则抛异常

    import subprocess
    subprocess.check_call(["ls", "-l"])
    subprocess.check_call("exit 1", shell=True)
    
    ret = subprocess.call(["ipconfig"],shell=False)
    print(ret)
    
    ret = subprocess.call("ipconfig",shell=True)
    print(ret)

    check_output

    执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常

    subprocess.check_output(["echo", "Hello World!"])
    subprocess.check_output("exit 1", shell=True)

    subprocess.Popen(...) 用于执行复杂的系统命令

    参数:

      • args:shell命令,可以是字符串或者序列类型(如:list,元组)
      • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
      • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
      • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
      • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
        所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
      • shell:同上
      • cwd:用于设置子进程的当前目录
      • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
      • universal_newlines:不同系统的换行符不同,True -> 同意使用
      • startupinfo与createionflags只在windows下有效
        将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
    import subprocess
    ret1 = subprocess.Popen(["mkdir","t1"])
    ret2 = subprocess.Popen("mkdir t2", shell=True)

    终端输入的命令分为两种:

    • 输入即可得到输出,如:ifconfig
    • 输入进行某环境,依赖再输入,如:python
    import subprocess
    
    obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
    import subprocess
    
    obj = subprocess.Popen(["python"],
        stdin=subprocess.PIPE,  #写管道
        stdout=subprocess.PIPE, #拿结果管道
        stderr=subprocess.PIPE, #拿错误结果管道
        universal_newlines=True)
    
    #输入两个命令
    obj.stdin.write("print(1)
    ")
    obj.stdin.write("print(2)")
    obj.stdin.close()
    
    #取输出结果
    cmd_out = obj.stdout.read()
    obj.stdout.close()
    
    #取错误输出结果
    cmd_error = obj.stderr.read()
    obj.stderr.close()
    
    #打印结果
    print(cmd_out)
    print(cmd_error)
  • 相关阅读:
    progresql
    postgresql
    postgresql
    postgresql 索引
    postgresql 视图
    postgresql 触发器
    postgresql异常快速定位
    postgresql数据库备份和恢复
    amgular $q用法
    安装fcitx
  • 原文地址:https://www.cnblogs.com/tangshengwei/p/5815148.html
Copyright © 2020-2023  润新知