• Python-Basis-13th


    周四,晴,记录生活分享点滴

    参考博客1:https://www.cnblogs.com/yuanchenqi/articles/5732581.html

    参考博客2:https://www.cnblogs.com/alex3714/articles/5765046.html

    Python版本:3.5

    模块和包

    模块的概念

    在Python中,一个.py文件就称之为一个模块(Module)。

    模块提高了代码的可维护性,分为三种:

    1. python标准库
    2. 第三方模块
    3. 应用程序自定义模块

    模块导入方法

    import 语句

    import module1[, module2[,... moduleN]  # 导入同级别即当前目录的模块

    from…import 语句

    from modname import name1[, name2[, ... nameN]]  # 从modname目录下导入name模块

    from…import* 语句

    from modname import*  # 导入modname模块所有的项目

    运行本质

    1 import test  
    2 from test import add
    # 1和2都是通过sys.path找到test.py,然后执行test脚本(全部执行),区别是1会将test这个变量名加载到名字空间,而2只会将add这个变量名加载进来。

    包(package)

    __init__.py

    • 每一个包目录下面都会有一个 __init__.py 的文件,__init__.py 可以是空文件,也可以有Python代码,__init__.py 本身就是一个模块
    • 调用包就是执行包下的__init__.py文件 

    BASEDIR、__name__变量

    • 找nod1里import  hello
    • 在pycharm可以找到,因为pycharm把myapp这一层路径加入到了sys.path里面;
    • 在命令行运行报错,需要把这个路径加进去
    import sys,os
    BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    import hello
    hello.hello1()

    使.py既可导入又可执行

    if __name__=='__main__':
        print('ok')

    引用模块过程

    ##-------------cal.py
    def add(x,y):
     
        return x+y
    ##-------------main.py
    import cal      #from module import cal
     
    def main():
     
        cal.add(1,2)
         
    ##--------------bin.py
    from module import main
     
    main.main()

    注意

    • from module import cal 改成 from . import cal同样可以,这是因为bin.py是我们的执行脚本,sys.path里有bin.py的当前环境,即/Users/yuanhao/Desktop/whaterver/project/web这层路径。
    • 无论import what , 解释器都会按这个路径找。
    • 所以当执行到main.py时,import cal会找不到,因为sys.path里没有/Users/yuanhao/Desktop/whaterver/project/web/module这个路径,而 from module/. import cal 时,解释器就可以找到了。

    目录结构

    假设项目名为foo

    Foo/
    |-- bin/
    |   |-- foo
    |
    |-- foo/
    |   |-- tests/
    |   |   |-- __init__.py
    |   |   |-- test_main.py
    |   |
    |   |-- __init__.py
    |   |-- main.py
    |
    |-- docs/
    |   |-- conf.py
    |   |-- abc.rst
    |
    |-- setup.py
    |-- requirements.txt
    |-- README

    1. bin/: 存放项目的一些可执行文件,可以起其他名,例如 script/ 之类的。

    2. foo/: 存放项目的所有源代码。

    (1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。

    (2) 其子目录 tests/ 存放单元测试代码;

    (3) 程序的入口最好命名为 main.py

    3. docs: 存放一些文档。

    4. setup.py: 安装、部署、打包的脚本。

    5. requirements.txt: 存放软件依赖的外部Python包列表。

    6. README: 项目说明文件。

    (1)软件定位,软件的基本功能。

    (2)运行代码的方法: 安装环境、启动命令等。

    (3)简要的使用说明。

    (4)代码目录结构说明,更详细点可以说明软件的基本原理。

    (5)常见问题说明。

    json & pickle

    序列化

    • 把对象(变量)从内存中变成可存储或传输的过程。
    • 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。

    json

    • 在不同的编程语言之间传递对象,需要把对象序列化为标准格式。
    • JSON表示一个字符串,可以被所有语言读取,也可以存储到磁盘或者通过网络传输。
    • JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取。

    #----------------------------序列化
    import json
     
    dic={'name':'alvin','age':23,'sex':'male'}
    print(type(dic))#<class 'dict'>
     
    j=json.dumps(dic)
    print(type(j))#<class 'str'>
     
     
    f=open('序列化对象','w')
    f.write(j)  #-------------------等价于json.dump(dic,f)
    f.close()
    #-----------------------------反序列化<br>
    import json
    f=open('序列化对象')
    data=json.loads(f.read())#  等价于data=json.load(f)

    注意

    import json
    #dct="{'1':111}"#json 不认单引号
    #dct=str({"1":111})#报错,因为生成的数据还是单引号:{'one': 1}
    
    dct='{"1":"111"}'
    print(json.loads(dct))
    
    #conclusion: 无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads

    pickle(不推荐)

    只能用于Python,并且可能不同版本的Python彼此都不兼容

    ##----------------------------序列化
    import pickle
     
    dic={'name':'alvin','age':23,'sex':'male'}
     
    print(type(dic))#<class 'dict'>
     
    j=pickle.dumps(dic)
    print(type(j))#<class 'bytes'>
     
     
    f=open('序列化对象_pickle','wb')#注意是w是写入str,wb是写入bytes,j是'bytes'
    f.write(j)  #-------------------等价于pickle.dump(dic,f)
     
    f.close()
    #-------------------------反序列化
    import pickle
    f=open('序列化对象_pickle','rb')
     
    data=pickle.loads(f.read())#  等价于data=pickle.load(f)
     
     
    print(data['age'])  

    shelve模块

    • shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写
    • key必须为字符串,而值可以是python所支持的数据类型
    import shelve
     
    f = shelve.open(r'shelve.txt')
     
    # f['stu1_info']={'name':'chung','age':'23'}
    # f['stu2_info']={'name':'zack','age':'30'}
    # f['school_info']={'website':'cnblogs.com','city':'beijing'}
    
    # f.close()
     
    print(f.get('stu_info')['age'])

    xml模块

    xml是实现不同语言或程序之间进行数据交换的协议

    与json差不多,但是 json 使用起来更简单,需要会读xml,写的时候用 json

    格式

    通过<>节点来区别数据结构

    <?xml version="1.0"?>
    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2011</year>
            <gdppc>59900</gdppc>
            <neighbor name="Malaysia" direction="N"/>
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor name="Costa Rica" direction="W"/>
            <neighbor name="Colombia" direction="E"/>
        </country>
    </data>

    操作xml

    import xml.etree.ElementTree as ET
     
    tree = ET.parse("xmltest.xml")
    root = tree.getroot()
    print(root.tag)
     
    #遍历xml文档
    for child in root:
        print(child.tag, child.attrib)
        for i in child:
            print(i.tag,i.text)
     
    #只遍历year 节点
    for node in root.iter('year'):
        print(node.tag,node.text)
    #---------------------------------------
    
    import xml.etree.ElementTree as ET
     
    tree = ET.parse("xmltest.xml")
    root = tree.getroot()
     
    #修改
    for node in root.iter('year'):
        new_year = int(node.text) + 1
        node.text = str(new_year)
        node.set("updated","yes")
     
    tree.write("xmltest.xml")
     
     
    #删除node
    for country in root.findall('country'):
       rank = int(country.find('rank').text)
       if rank > 50:
         root.remove(country)
     
    tree.write('output.xml')

    创建xml

    import xml.etree.ElementTree as ET
     
     
    new_xml = ET.Element("namelist")
    name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
    age = ET.SubElement(name,"age",attrib={"checked":"no"})
    sex = ET.SubElement(name,"sex")
    age.text = '33'
    name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
    age = ET.SubElement(name2,"age")
    age.text = '19'
     
    et = ET.ElementTree(new_xml) #生成文档对象
    et.write("test.xml", encoding="utf-8",xml_declaration=True)
     
    ET.dump(new_xml) #打印生成的格式
  • 相关阅读:
    一起谈.NET技术,验证.NET强命称的思路和实例 狼人:
    一起谈.NET技术,基于SQL Server 2008 Service Broker构建企业级消息系统 狼人:
    一起谈.NET技术,一句代码实现批量数据绑定[下篇] 狼人:
    一起谈.NET技术,晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo 狼人:
    一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(六)流光追影 狼人:
    一起谈.NET技术,ASP.NET下用URLRewriter重写二级域名 狼人:
    这样覆写Object类的toString方法对吗
    【Cocos2DX 】初窥门径(7)无限地图滚动
    poj2975——Caesar密码
    [置顶] poi最简单易学解析xls代码
  • 原文地址:https://www.cnblogs.com/chungzhao/p/13038265.html
Copyright © 2020-2023  润新知