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) #打印生成的格式

 

posted @ 2020-06-04 11:24  ChungZhao  阅读(137)  评论(0编辑  收藏  举报