Module

Module

模块

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

分类

但其实import加载的模块分为四个通用类别:

  • 内置标准模块(又称标准库)执行help('modules')查看所有Python自带模块列表
  • 第三方开源模块,可通过pip install 模块名 联网安装
  • 自定义模块
优点

是用模块最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突方法是选择一个顶层包名,比如mycompany,按照如下目录>>>存放引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。
请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany。

自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。

此处是深坑!请注意!详见Python踩坑指南:
https://blog.csdn.net/Viper__s/article/details/80935996

模块调用
import module

from module import xxxx

from module.xx.xx import xx as rename

from module.xx.xx import *

注意:模块一旦被调用,即相当于执行了另外一个py文件里的代码

自定义模块

这个最简单,创建一个.py文件,就可以称之为一个模块,就可以在另外一个程序里导入

模块查找路径
import sys

print(sys.path)

# ['C:\\Python\\Object Oriented', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages']

Python解释器会按照列表表顺序依次到每个目录下去匹配你要导入的模块名,只要在一个目录下匹配到了该模块名,就立即导入,不在继续往后找
注意:列表的第一个元素为空,即代表当前目录,所以你自定义的模块在当前文件会被优先导入

开源模块额安装,使用

https://pypi.python.org/pypi
待更新

待更新

跨模块导入

待更新

绝对导入&相对导入

待更新

序列化(json&pickle)

把变量从内存中变成可存储或传输的过程称之为序列化>>>
在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening 等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
序列化的目的:

1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

Python 提供了pickle 模块来实现序列化。首先,我们尝试把一个对象序列化并写入文件:

import pickle
from typing import Dict

d = dict(name='linga', age=18, hobby='football')
d_dumps = pickle.dumps(d)
print(pickle.dumps(d_dumps))
# b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00lingaq\x02X\x03\x00\x00\x00ageq\x03K\x12X\x05\x00\x00\x00hobbyq\x04X\x08\x00\x00\x00footballq\x05u.'

d_loads = pickle.loads(d_dumps)
print(d_loads)
# {'name': 'linga', 'age': 18, 'hobby': 'football'}

json:用于字符串和Python数据类型间in行转换
pickle:用于Python特有的类型和Python的数据类型间进行转换
json,pickle两个都有四个模块:
dump,load:单个数据读写一个文件
dumps,loads:用于网络传输,多个数据读写一个文件

import pickle
data = {"k1": 123, "k2": "hello"}
# pickle.dumps将数据通过特殊的形式转换为只有Python语言认识的字符串
p_str = pickle.dumps(data)
print(p_str)


# pickle.dumps将数据通过特殊的形式转换为只有Python语言认识的字符串,并写入文件
with open('test.pk','wb') as fh:
    pickle.dumps(data,fh)
  
    
import json


# json.dumps将数据通过特殊的形式转换为所有编程语言都认识的字符串
j_str = json.dumps(data)
print(j_str)


# json.dumps将数据通过特殊的形式转换为所有编程语言都认识的字符串,并写入文件
with open('test.pk','wb') as fh:
    json.dumps(data,fh)

通过下面这段代码详细了解下json的四个方法的使用:
常规用法:

import json
l1 = ['张三','历史','王五','alex','老土','旭哥']

# dump load 有关文件存储
f = open('json_file',encoding='utf-8',mode='w')
json.dump(l1,f,ensure_ascii=False)  # 将序列化的字符串存储到文件中
f.close()

f = open('json_file',encoding='utf-8')
ret = json.load(f)
print(ret,type(ret))
f.close()

文件操作相关:

import json


dic = {"alex": ('women','women','老女人')}
dic2 = {"alex1": ('women','women','老女人')}
dic3 = {"alex2": ('women','women','老女人')}

with open("json_module", mode='w', encoding='utf-8') as fh:
    json.dump(dic, fh, ensure_ascii=False)
    json.dump(dic2, fh, ensure_ascii=False)
    json.dump(dic3, fh, ensure_ascii=False)

f = open('json_module', encoding='utf-8',)
print(json.load(f))
print(json.load(f))
print(json.load(f))
f.close()

执行后

C:\Python36\python.exe C:/Python/Module/json_module.py
Traceback (most recent call last):
  File "C:/Python/Module/json_module.py", line 14, in <module>
    print(json.load(f))
  File "C:\Python36\lib\json\__init__.py", line 299, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "C:\Python36\lib\json\__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "C:\Python36\lib\json\decoder.py", line 342, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 36 (char 35)

将多个序列化的字符串写入文件,然后反序列化,就会出错,用dump,load只能写入和读取文件:一个序列化的字符串
这里的dump直接将一个文件序列化成一个字符串,而反序列化时按照之前的文件操作一行一行的读取.
如果说一定要这样实现的话看下面这段代码:

import json


dic = {"alex": ('women', 'women', '老女人')}
dic2 = {"alex1": ('women', 'women', '老女人')}
dic3 = {"alex2": ('women', 'women', '老女人')}

with open('json_files', encoding='utf-8', mode='a') as f1:
    s1 = json.dumps(dic, ensure_ascii=False)        # ensure_ascii=False:可以看到写入的
    f1.write(s1+'\n')
    s2 = json.dumps(dic2, ensure_ascii=False)
    f1.write(s2+'\n')
    s3 = json.dumps(dic3, ensure_ascii=False)
    f1.write(s3+'\n')

with open('json_files', encoding='utf-8') as f2:
    for line in f2:
        dic = json.loads(line)
        print(dic, type(dic))

dic = {"alex": ('women','women','老女人')}
ret = "\n"+json.dumps(dic)
print(ret)

其他参数:

import json
data = {'username': ['李华', '二愣子'], 'sex': 'male', 'age': 16, 'A': 666}
json_dic2 = json.dumps(data, sort_keys=True, indent=2, separators=('|', '*'), ensure_ascii=False)
print(json_dic2)

print(json.loads(json_dic2)) # 如果改了:separators=('|','*')反序列化不行了
sort_keys = True      # 字典键的首字母的ascii码排序
ensure_ascii = False      # 显示中文
indent = 2    # key 缩进

dic = {(1, 2, 3): 'alex', 1: [1, 2, 3]}
ret = json.dumps(dic)
print(ret)  # TypeError: keys must be a string

json:
优点:跨语言,体积小
取点:只支持 int/str/list/tuple/dict
pickle:
优点:专为Python设计,支持Python所有数据类型
取点:只能在Python中使用,存储数据占空间大

shelve模块

shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的数据格式.
存入数据:

import shelve

f = shelve.open('shelve_file')
f['key'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'}  #直接对文件句柄操作,就可以存入数据
f.close()

去除数据:

import shelve
f1 = shelve.open('shelve_file')
existing = f1['key']  #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f1.close()
print(existing)

这里的shevle将目标作为value存在自定义的key对应的文件中

import shelve
f = shelve.open('shelve_file', flag='r')
# existing = f['key']
f['key'] = [11,22,33]
f.close()
# print(existing)

f = shelve.open('shelve_file', flag='r')
ex = f['key']
print(ex)
f.close()

f['key'] = {'int':10, 'float':9.5, 'string':'Sample data','new_value': 'this was not here before'}
configparser模块

此模块用于生成和修改常见配置文档,可以包含一个或多个节(section),每个节可以有多个参数(键=值).当前模块名称在Python3.x中改名为configparser
来看一个好多软件的常见文档格式如下:

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
  
[bitbucket.org]
User = hg
  
[topsecret.server.com]
Port = 50022
ForwardX11 = no

解析文档配置:

import configparser

config = configparser.ConfigParser()

config["DEFAULT"] = {'ServerAliveInterval': '45',
                      'Compression': 'yes',
                     'CompressionLevel': '9',
                     'ForwardX11':'yes'
                     }

config['bitbucket.org'] = {'User':'hg'}

config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}

with open('example.ini', 'w') as configfile:

   config.write(configfile)

猜你喜欢

转载自www.cnblogs.com/linga/p/9288294.html