首页 > 其他分享 >模块介绍,包,json模块

模块介绍,包,json模块

时间:2024-04-19 17:11:06浏览次数:27  
标签:name py 介绍 json 导入 模块 import

【一】模块

1.什么是模块

模块就是一系列功能的结合体,可以直接使用

2.为什么要模块

极大地提升开发效率

3.模块的三种来源

【1】内置模块

无需下载,解释器自带,直接导入使用即可

【2】自定义模块

自己写的代码,封装成模块,自己用或者是发布到网上供别人使用

【3】第三方模块

别人写的发布到网上,可以免费下载使用

4.模块的四种表现形式(长什么样子)

(1)使用python代码编写的py文件

(2)多个py文件组成的文件夹(包)

(3)已被编译为共享库或DLL的c或c++扩展

(4)使用c编写并链接到python解释器的内置模块

5.模块的两种导入方式

方式一:>>>> import…句型

方式二:>>>> from…import…句型

【1】import导入的底层原理

zyb.py是执行文件 md.py是被导入文件(模块)

ps:相同的模块反复被导入只会执行一次

# md.py
print('from the md.py')
name = 'silence'
money = 2000
def read():
    print('md',money)
    
# zyb.py
import md
name = 'happy'
print(md.name)  #获取的是模块(被导入的文件)名称空间中的name 换成md.money结果就是  2000
print(name)  # 获取当前名称空间中的name
md.read()
# 运行结果
'''
from the md.py
silence
md 2000
'''

【2】import句式特点

可以通过import后面的模块名点的方式,使用模块中所有的数据

并且不会与当前名称空间中的名字冲突

【3】from…import…句型导入的底层原理

ps:相同的模块反复被导入只会执行一次

# md.py
print('from the md.py')
name = 'silence'
money = 2000
def read():
    print('md',money)

# zyb.py
from md import name

print(name)
'''
1.执行当前文件产生一个名称空间
2.执行导入语句 运行模块文件产生名称空间存放运行过程中的所有名字
3.将import后面的名字直接拿到当前执行文件中
'''

【4】from…import…句式特点

1.重复导入也只会导入一次

2.使用模块名称空间中的名字不需要加模块前缀 直接使用即可

3.使用from…import…句式 只能使用import后面出现的名字

​ from…import…简单翻译就是

​ 从….里面拿….来用 没有提到的都不能用

4.缺点就是from…import…的句式会产生名字上的冲突问题

​ 使用时一定要避免名字冲突

# md.py
print('from the md.py')
name = 'silence'
money = 2000
def read():
    print('md',money)

# zyb.py
from md import name
name = 'happy'
print(name)
# 最后输出 happy

【5】导入语法补充说明

(1).可以给模块起别名

语法:mport…as….

​ from…import…as….

# md.py
print('from the md.py')
name = 'silence'
money = 2000
def read():
    print('md',money)

    
# zyb.py    
'''
比如模块很复杂 可以起名简写
'''
import  md as m
print(m.money)

from md import name as n
print(n)
# 输出结果
# from the md.py
# 2000
# silence

(2).连续导入多个模块或者变量名

import time, money,sys…

连续导入多个模块,这多个模块最好有相似的功能部分,如果没有建议分开导入

如果是同一个模块下的多个变量名无所谓

(3).通用导入

from md import *

*表示md里所有的名字 from…import的句式也可以导入所有的名字

如果模块文件使用了双下all限制了可以使用的名字 那么*就会失效 依据双下all后面列举的名字

【二】循环导入问题

【1】问题来源

# a.py
import b

name = 'from a'

print(b.name)
# b.py
import a

name = 'from b'

print(a.name)
# 报错 partially initialized module 'b' has no attribute 'name' 

【2】解决办法

(1)办法一

将导入模块的句式放到定义名字下面

# a.py
name = 'from a'
import b
print(b.name)
# b.py
name = 'from b'
import a
print(a.name)
# 输出结果
# from b
# from a
# from b

(2)办法二

将导入模板的句式写在函数体代码内,只要函数不调用就不会触发导入语句

# a.py
name = 'from a'
def index():
    import b
    print(b.name)
index()
# b.py
name = 'from b'
def index():
    import a
    print(a.name)
index()

【三】判断文件类型

py文件可以被分为两种类型

  • 执行文件

  • 被导入文件

'''
有一个内置变量__name__
	当__name__所在文件是执行文件的时候,结果是__main__
	当__name__所在文件是被导入文件的时候,结果是文件名(模块名)

'''
'''
可以借助__name__区分被导入的代码和测试代码
if __name__ == '__main__':
	当前文件是执行文件的时候才会执行的子代码块
'''
由于上述代码在很多启动脚本中经常使用 所以有简写方式
	直接输入main之后按tab键即可

【四】模块的查找顺序

【1】查找顺序



# 先从自己的局部查
'''
def func():
    import time
'''
# 再从全局查
'''
import time 
'''
# 去内建查
'''
python解释器自带的模块和你安装的模块中查,查出对应的模块再使用
'''
# 去底层 c 语言查
'''
有些功能你点进去看源码发现只要一个 pass
使用c语言写的,但是不想让你看到所有就省略掉了
'''
'''
1.先从内置空间中查找
2.再从内置模块中查找
3.最后去sys.path查找(类似于环境变量)
如果上述三个地方都找不到 那么直接报错
'''

验证sys.path(类似于环境变量)

import sys
print(sys.path) # 结果是一个列表 里面存放了很多路径

sys.path中虽然有很多路径 但是只需要重点关注第一个

第一个其实就是执行文件所在的路径

查找模块的时候只需要站在执行文件所在路径查看即可 有就可以 没有就不行

【2】如何解决sys.path中没有模块所在路径问题

方式一:

主动添加sys.path路径(类似于添加环境变量)

虽然他会爆红,但是还是能找到这个文件

如果从mddd.py中找test.py能否调用找到

也是可以的 理由如下,但是如果关闭 那就找不到了

'''
pycharm会自动将项目目录所在的路径添加到sys.path中
'''

方式二:

利用from…import….句式指名道姓的查找

from aaa import mddd # 从文件夹aaa中导入mddd模块
print(mddd.name)

from aaa.bbb.ccc import mm # 通过点的方式进入下一层目录
print(mm.name)

【5】绝对路径和相对路径

1.绝对路径

# D:\Python\PythonProjects\PythonProjects29\zyn
# ./ 表示当前同级目录下
# ../ 表示当前目录的上一级目录
# 默认就是当前目录下
with open('../user_data.text', 'w', encoding='utf-8') as fp:
    fp.write('111')

2.相对路径

# 在python内部查找的顺序都是绝对路径
import sys
print(sys.path)
# [
# 'D:\\Python\\PythonProjects\\PythonProjects29\\zyn',
# 'D:\\Python\\PythonProjects\\PythonProjects29\\zyn',
# 'D:\\PyCharm\\plugins\\python\\helpers\\pycharm_display',
# 'D:\\Python38\\python38.zip',
# 'D:\\Python38\\DLLs',  # 这里放的就是c语言源码编译后的扩展包
# 'D:\\Python38\\lib', # 放的是内置的模块或者安装的模块
# 'D:\\Python38', # 安装python解释器的路径
# 'D:\\Python38\\lib\\site-packages', # 这里面也有部分安装的的包 ,默认安装到 site-packages
# 'D:\\PyCharm\\plugins\\python\\helpers\\pycharm_matplotlib_backend'# 回到pycharm
# ]

绝对导入和相对导入

在导入模块的时候一切查找模块的句式都是以执行文件为准

​ 无论导入的句式是在执行文件中还是在被导入文件中

绝对导入:

永远按照执行文件的路径一层层往下查找(无脑查找即可)

相对导入:

​ 相对导入打破了必须参照执行文件的所在路径要求,只需要考虑当前模块所在的路径如何使用特殊符号.去查找其他模块即可

from . import a

相对导入只能在被导入文件中使用 不能在执行文件中使用

'''
预备知识
	.表示当前路径
	..表示上一层路径
	../..表示上上一层路径
'''

# 模块是功能和集合体,将开发的当前模块的所有功能都放到了一个 模块中
# 加(逻辑验证) 减(逻辑验证) 乘(逻辑验证) 除(逻辑验证)
# 将上述四个模块统一成一个文件夹,从这个文件夹中导入指定的功能即可
# 包就是模块的几何体
# 从专业角度来解释的话
	包就是内部含有__init__.py的文件夹
# 从多角度来解释的话
	包就是多个模块的结合体(内部存放了多个模块文件)
# 在pycharm中甚至直接提供了创建包的选项
	本质就是文件夹里面有一个__init__.py文件
'''
再导入包的时候,索要名字其实是跟包里的__init__.py要
	1.如果想直接通过包的名字使用包里所有的模块,那么就需要在__init__.py中提前导入
	上述方式的好处在于__init__可以提前帮你准备好可以使用的名字
	
	
	2.也可以直接忽略__init__的存在使用绝对导入即可
	上述的好处在于不需要考虑包的存在,直接当成普通文件夹使用即可

'''

json模块

''' json模块是一个序列化模块 ,主要用于跨语言传输'''
1.由下图可知json格式数据是不同编程语言之间数据交互的媒介
2.json格式数据的具体特征
	结论一中:数据基于网络传输肯定是二进制格式
    在python中bytes类型的数据可以直接看成是二进制格式
    在python中只有字符串可以转成bytes类型(编码encode())
# 由上述推论可知 json格式数据 应该属于字符串类型
'''双引号是json格式数据独有的标志'''
json.dumps()     序列化
	将python数据类型转换成json格式字符串
json.loads()     反序列化
	将json格式字符串转换成对应的数据类型

【1】什么是序列化

# 将Python中的字典、列表、元组 ... 转换成 字符串类型
# 如果使用str强制转换数据类型,造成的后果就是转换后的字符串无法转回Python对象

【2】什么是反序列化

# 将字符串类型的数据转换成Python对象(列表、字典、元组 ... )
# 能将python对象转为字符串 --> 字符串转回python对象

【3】json模块

(1)导入json模块

import json

(2)存储数据和读取数据

# (1)序列化保存Python对象数据
user_data_dict = {
    'username': "silence",
    "password": "741"
}

# 存储为json文件数据
'''
with open('user_data.json', 'w', encoding="utf-8") as fp:
    json.dump(obj=user_data_dict, fp=fp)
'''
# 在内部自动将单引号全部转换为双引号,然后保存进去
# 读取
# (2)将json格式数据转换为Python对象
'''
with open('user_data.json', 'r', encoding="utf-8") as fp:
    data = json.load(fp=fp)
print(data, type(data))
'''

(3)转换

# 反序列化和序列化方法之转换
# 我就想将一个字典转换为字符串  转回字典

# (1)将字典转换为字符串格式
data_json_str = json.dumps(obj=user_data_dict)
print(data_json_str, type(data_json_str))  # {"username": "silence", "password": "741"} <class 'str'>


# (2)将字符串转回 python对象
data_json_dict = json.loads(data_json_str)
print(data_json_dict, type(data_json_dict))  # {'username': 'silence', 'password': '741'} <class 'dict'>

(4)保存中文数据

user_data = {'name': "墨漓", "age": 18}
with open('data.json', 'w', encoding='utf-8') as fp:
    json.dump(obj=user_data, fp=fp, ensure_ascii=False)

# 编码和解码
# 编码 encode(编码格式)
# 解码 decode(编码格式)

标签:name,py,介绍,json,导入,模块,import
From: https://www.cnblogs.com/zyb123/p/18146427

相关文章

  • Elasticsearch 所有内置分析器介绍(5)
     Elasticsearch 附带了各种内置分析器,可以直接在任何索引中使用,而无需额外配置:1)标准分析器  StandardAnalyzer该分析器的文本分词规则是:过滤掉大多数标点符号来划分单词,通过Unicode文本分割算法,再转成小写的分词。支持删除常用的停用词(如:the,a......
  • WebGIS 瓦片地图引擎实现之——地图瓦片加载计算原理介绍
    WebGIS瓦片地图引擎实现之——地图瓦片加载计算原理介绍ThinkGISGIS背景在蚂蚁搞空间数据可视化,L7地理可视化引擎作者​关注他 65人赞同了该文章.背景1.1地图瓦片之前在地图瓦片技术使用之前,用户使用在线地图,一般都是客户端把将要显示的......
  • 科学可视化软件介绍 – OpenSceneGraph
    科学可视化软件介绍–OpenSceneGraph叶刘克拉克莫夫​中国石油大学有机化工硕士​关注他 6人赞同了该文章 OpenSceneGraph(有时候简称为OSG)是一个开源的高性能三维图形开发工具包,供软件开发人员在可视模拟、游戏、虚拟现实、科学可视化和建模......
  • 数仓的两种轻量级数据交换格式:json与jsonb
    本文分享自华为云社区《GaussDB(DWS)——探究JSON,JSONB》,作者:yd_283975606。1.前言适用版本:【8.1.1(及以上)】JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于将数据从服务器发送到Web应用程序。它采用人类易读和机器易解析的文本格式,基于键值对的集合,用于......
  • 数据结构-线性结构-基础介绍
    前言本文是看bilibili·王道考研·数据结构的视频课程时做的一些记录,如构成侵权,请联系我删除另外,本文有部分内容是根据我的理解写的,可能有不明确的地方awa王道考研的视频地址我就不放了,大家请移步bilibili直接搜索王道考研就能搜索到线性结构-一对一关系除了第......
  • ddddocr基本使用和介绍
    ddddocr基本使用和介绍在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,这时候就需要用到今天给大家介绍的python第三方库ddddocr,ddddocr是一款强大的通用开源ocr识别库,具有高效、准确、易用的特点,广泛应用于图像处理和文字识别任务。本文将为大家介绍ddddocr的基本......
  • BOSHIDA DC电源模块的未来发展方向和创新应用领域
    BOSHIDADC电源模块的未来发展方向和创新应用领域随着科技的快速发展,直流(DC)电源模块的应用领域也在不断扩大。从传统的电子产品到新兴的清洁能源领域,DC电源模块正发挥着越来越重要的作用。未来,DC电源模块将继续发展,并在更多领域创造创新应用。 一,DC电源模块在电子产品中的应......
  • ddddocr基本使用和介绍
    ddddocr基本使用和介绍摘要:在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,这时候就需要用到今天给大家介绍的python第三方库ddddocr,ddddocr是一款强大的通用开源ocr识别库,具有高效、准确、易用的特点,广泛应用于图像处理和文字识别任务。本文将为大家介绍ddddocr的......
  • python基础之-sys模块、os模块基本介绍(未完成)
    背景介绍在自动化脚本中,经常会用到类似:sys.argv[1]和os.getenv("id")两种方式进行传参,为了便于区分,鉴于自己的理解进行一定记录,后续将继续补充。基本介绍一、sys模块它的很多属性描述程序的执行环境,是python的基础模块。*sys.argv:实现从程序外部向程序传递参数。*sys.a......
  • python使用pip安装模块出错 Retrying (Retry(total=0, connect=None, read=None, redi
    问题:在使用python时,使用pip安装psutil出错(pipinstallpsutil),错误信息:Retrying(Retry(total=0,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby‘SSLError(SSLError(1,u’[SSL:CERTIFICATE_VERIFY_FAILED]certificateverifyfailed......