目录
[1.2.3模块的 name 属性](#1.2.3模块的 name 属性)
[1.3Python 的第三方模块](#1.3Python 的第三方模块)
[1.4Python 常用的内建模块](#1.4Python 常用的内建模块)
[1.4.1 random 模块](#1.4.1 random 模块)
[1.4.2time 模块](#1.4.2time 模块)
[1.4.3datetime 模块](#1.4.3datetime 模块)
[1.4.5os.path 模块](#1.4.5os.path 模块)
[2.1 包的定义和作用](#2.1 包的定义和作用)
[2.2 导入包和子包](#2.2 导入包和子包)
[2.3 使用包和子包](#2.3 使用包和子包)
[2.4 init.py文件](#2.4 init.py文件)
[3. 第三方包](#3. 第三方包)
[3.1 安装和使用](#3.1 安装和使用)
[try 语句](#try 语句)
[raise 语句](#raise 语句)
[6.JSON 数据解析](#6.JSON 数据解析)
1.模块(Modules)
1.1模块的介绍
一个.py 文件就是一个模块
模块是含有一系列数据 ,函数 ,类等的程序
作用
把相关功能的函数等放在一起有利于管理,有利于多人合作开发
模块的分类
①内置模块(在python3 程序内部,可以直接使用)
②标准库模块(在python3 安装完后就可以使用的 )
③第三方模块(需要下载安装后才能使用)
④自定义模块(用户自己编写)
注意
模块名如果要给别的程序导入,则模块名必须是 标识符
1.2导入模块
1.2.1语法
(1)import 模块名 [as 模块新名字1]
导入一个模块到当前程序
(2)from 模块名 import 模块属性名 [as 属性新名]
导入一个模块内部的部分属性到当前程序
(3)from 模块名 import *
导入一个模块内部的全部属性到当前程序
示例:
python
#File:PythonBasic1\demo2.py
def pow(x,y):
return x**y
python
#File:PythonBasic2\demo3.py
def add(x,y):
return x+y
调用模块
python
#File:PythonBasic1\demo1.py
# 在同一package下导入:
import demo2 as demo2
print(demo2.pow(2, 8))
# 在不同package下导入,方式1:
import PythonBasic2.demo3 as demo3
print(demo3.add(1, 2))
# 在不同package下导入,方式2:
from PythonBasic2 import demo3
print(demo3.add(1, 2))
1.2.2模块的内部属性
file 绑定模块的路径
name 绑定模块的名称
如果是主模块(首先启动的模块)则绑定 'main'
如果不是主模块则 绑定 xxx.py 中的 xxx 这个模块名
1.2.3模块的 __name__
属性
每个.py 模块文件都会有 __name__
属性
①最先运行的模块主模块, 主模块的__name__
属性绑定'__main__'
字符串
②如果一个模块是被导入模块,则此模块不是主模块。
1.2.4主模块
__name__
== '__main__'
当一个模块是直接运行的,即不是通过 import
语句导入的,那么它的 __name__
属性会被赋值为 '__main__'
。
1.2.5被导入的模块
__name__
== 模块名
当一个模块被导入到另一个模块中时,它的 __name__
属性会被赋值为它的模块名。
python
print(f"This module's name is {__name__}") # 被其他模块导入时会自动运行
1.3Python 的第三方模块
使用导入的模块中的函数、变量等,可以通过模块名或从语句中导入的名称来访问。
1.4Python 常用的内建模块
1.4.1 random 模块
python
import random
函数 | 描述 |
---|---|
random.choice(seq) | 从序列的元素中随机挑选一个元素. |
random.randrange (start, stop,step) | 从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1 |
random.random() | 随机生成下一个实数,它在[0,1)范围内。 |
random.shuffle(list) | 将序列的所有元素随机排序,修改原list |
uniform(x, y) | 随机生成实数,它在[x,y]范围内.生成随机数 |
python
import random
odd =random.randrange(1,11,2)
print(odd)
char = random.choice("WORLD")
print(char)
char = random.choices("WORLD")
print(char)
ones=random.random()*10
print(ones)
# 保留两位小数
num=round(random.random()*10,2)
print(num)
1.4.2time 模块
时间戳:从 1970年1月1日 0:0:0 UTC 时间 开始计时到现在的秒数
UTC 时间 : 世界协调时间
struct_time 用 含有9个元素的元组来表示时间
python
import time
# 返回当前时间的时间戳
print(time.time())
# 返回当前的UTC 时间的字符串
print(time.ctime())
# 返回当前的本地时间元组
t = time.localtime()
print(t)
# 让程序睡眠 n 秒
time.sleep(3)
# 格式化时间
print(time.strftime("%Y-%m-%d", t))
# 用时间元组来创建自定义的时间
t2 = time.struct_time((2024, 10, 30, 10, 11, 20, 0, 0, 0))
print(t2)
1.4.3datetime 模块
python
import datetime
# 返回当前的时间
d1 = datetime.datetime.now()
print(d1)
# 用 datetime 的各个属性可以得到 具体的信息
print(d1.year)
# 格式化
print(d1.strftime("%Y-%m-%d"))
# 计算时间差
delta_time = datetime.timedelta(days=2, hours=1)
print(delta_time)
# 计算 未来时间
print(d1+delta_time)
1.4.4os模块
是Python标准库中的一部分,提供了一种与操作系统进行交互的方法。主要功能包括文件和目录的操作、路径处理、进程管理等。
python
#1. os.getcwd(): 获取当前工作目录
import os
current_directory = os.getcwd()
print("当前工作目录:", current_directory)
#2. os.chdir(path): 改变当前工作目录
import os
new_directory = "/path/to/new/directory"
os.chdir(new_directory)
print("工作目录已更改为:", os.getcwd())
#3. os.listdir(path='.'): 返回指定目录下的所有文件和目录列表
import os
directory_path = "."
files_and_dirs = os.listdir(directory_path)
print("指定目录下的文件和目录列表:", files_and_dirs)
#4. os.mkdir(path): 创建目录
import os
new_directory = "new_folder"
os.mkdir(new_directory)
print(f"目录 '{new_directory}' 已创建")
#5. os.rmdir(path): 删除目录
import os
directory_to_remove = "new_folder"
os.rmdir(directory_to_remove)
print(f"目录 '{directory_to_remove}' 已删除")
#6. os.remove(path): 删除文件
import os
file_to_remove = "example.txt"
os.remove(file_to_remove)
print(f"文件 '{file_to_remove}' 已删除")
1.4.5os.path 模块
os.path
模块是 Python 标准库的一部分,专门用于处理文件和目录路径的操作。它提供了一系列函数,用于操作和处理文件路径,使得路径操作更加方便和跨平台。
python
#1.os.path.basename(path): 返回路径中最后的文件名或目录名
import os
path = "/path/to/some/file.txt"
print(os.path.basename(path)) # 输出: file.txt
#2.os.path.dirname(path): 返回路径中的目录部分
import os
path = "/path/to/some/file.txt"
print(os.path.dirname(path)) # 输出: /path/to/some
#3.os.path.join(*paths): 将多个路径合并成一个路径
import os
path1 = "/path/to"
path2 = "some/file.txt"
full_path = os.path.join(path1, path2)
print(full_path) # 输出: /path/to/some/file.txt
#4.os.path.split(path): 将路径分割成目录和文件名
import os
path = "/path/to/some/file.txt"
print(os.path.split(path)) # 输出: ('/path/to/some', 'file.txt')
#5.os.path.splitext(path): 将路径分割成文件名和扩展名
import os
path = "/path/to/some/file.txt"
print(os.path.splitext(path)) # 输出: ('/path/to/some/file', '.txt')
#6.os.path.exists(path): 检查路径是否存在
import os
path = "/path/to/some/file.txt"
print(os.path.exists(path)) # 输出: True 或 False
#7.os.path.isfile(path): 检查路径是否是文件
import os
path = "/path/to/some/file.txt"
print(os.path.isfile(path)) # 输出: True 或 False
#8.os.path.isdir(path): 检查路径是否是目录
import os
path = "/path/to/some/directory"
print(os.path.isdir(path)) # 输出: True 或 False
2.包(Packages)
2.1 包的定义和作用
定义
-
包是将模块以文件夹的组织形式进行分组管理的方法,以便更好地组织和管理相关模块。
-
包是一个包含一个特殊的
__init__.py
文件的目录,这个文件可以为空,但必须存在,以标识目录为Python包。 -
包可以包含子包(子目录)和模块,可以使用点表示法来导入。
作用
-
将一系列模块进行分类管理,有利于防止命名冲突
-
可以在需要时加载一个或部分模块而不是全部模块
2.2 导入包和子包
- 使用
import
关键字可以导入包和子包,以访问其中的模块和内容。
同模块的导入规则
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名 [as 模块新名]
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
导入包内的所有子包和模块
from 包名 import *
from 包名.模块名 import *
python
# 导入包中的模块
import matplotlib.pyplot as plt
2.3 使用包和子包
- 使用导入的包和模块的内容,可以通过包名和点表示法来访问。
python
# 使用包中的模块
import pandas as pd
data_frame = pd.DataFrame()
# 使用子包中的模块
from tensorflow.keras.layers import Dense
2.4 init.py文件
init.py 文件的主要作用是用于初始化Python包(package)或模块(module),它可以实现以下功能:
-
标识包目录: 告诉Python解释器所在的目录应被视为一个包或包含模块的包。没有这个文件,目录可能不会被正确识别为包,导致无法导入包内的模块。
-
执行初始化代码: 可以包含任何Python代码,通常用于执行包的初始化操作,如变量初始化、导入模块、设定包的属性等。这些代码在包被导入时会被执行。
-
控制包的导入行为: 通过定义 all 变量,可以明确指定哪些模块可以被从包中导入,从而限制包的公开接口,防止不需要的模块被导入。
-
提供包级别的命名空间: init.py 中定义的变量和函数可以在包的其他模块中共享,提供了一个包级别的命名空间,允许模块之间共享数据和功能。
-
批量导入模块: 可以在 init.py 文件中批量导入系统模块或其他模块,以便在包被导入时,这些模块可以更方便地使用。
python
# 1. 批量导入系统模块
import os
import sys
import datetime
# 2. 定义包级别的变量
package_variable = "This is a package variable"
# 3. 控制包的导入行为
__all__ = ['module1', 'module2']
# 4. 执行初始化代码
print("Initializing mypackage")
# 注意:这个代码会在包被导入时执行
# 5. 导入包内的模块
from . import module1
from . import module2
3. 第三方包
Python第三方包是由Python社区开发的,可用于扩展Python功能和解决各种问题的软件包。这些包提供了各种各样的功能,包括数据分析、机器学习、网络编程、Web开发、图形处理、自然语言处理等。
3.1 安装和使用
(1)使用pip:pip是Python的包管理工具,用于安装、升级和管理第三方包。确保你的Python安装中包含了pip。
(2)安装第三方包:
- 使用pip安装包
在命令行中运行以下命令来安装包,将"package-name"替换为要安装的包的名称。
pip install package-name
- 安装特定版本的包
pip install package-name==version
- 通过镜像安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package1 package2 package3 ...
- 从requirements文件安装
可以将要安装的包及其版本记录在一个文本文件中,通常命名为requirements.txt,然后运行以下命令安装其中列出的所有包:
pip install -r requirements.txt
(3)导入包:在Python脚本或交互式环境中,使用import
语句导入已安装的包,以便在代码中使用它们。
import package_name
(4)使用包:每个第三方包都有不同的用法和功能,通常伴随着官方文档和示例代码。你可以查阅官方文档,或者使用help()
函数来了解包的功能和方法。示例:
python
import package_name
help(package_name)
(5)更新包:使用以下命令来更新已安装的包:
pip install --upgrade package-name
(6)卸载包:如果你想卸载包,可以使用以下命令:
pip uninstall package-name
3.2依赖清单
可以使用pipreqs来维护requirements.txt文件,以便轻松地重建环境。
pipreqs
是一个用于管理Python项目依赖清单的工具,它会自动分析项目代码,并生成requirements.txt
文件,列出项目所需的所有依赖包及其版本。
3.2.1安装pipreqs
可以使用pip安装它(比较慢,可能会丢包):
pip install pipreqs
3.2.2运行pipreqs
进入你的项目目录,然后运行以下命令:
pipreqs .
这会分析项目代码,并在当前目录下生成一个名为requirements.txt
的文件,其中包含了项目所需的所有依赖包及其版本。
3.2.3编码错误
若出现:UnicodeDecodeError则将指定编码为utf8:
pipreqs ./ --encoding=utf8
pipreqs ./ --encoding=gbk
pipreqs ./ --encoding='iso-8859-1'
3.2.4查看文件
打开requirements.txt
文件,你将看到列出的依赖包及其版本,类似于以下内容:
package1==1.0.0
package2==2.1.3
3.2.5是否修改
pipreqs
生成的requirements.txt
文件可能包含一些不必要的依赖,或者可能需要手动指定特定版本。可以编辑requirements.txt
文件,根据项目的需要添加、删除或修改依赖项。
3.2.6安装依赖:
可以使用pip
来安装项目的依赖:
pip install -r requirements.txt
3.2.7定期更新依赖:
定期使用pipreqs
重新生成requirements.txt
文件,以确保依赖清单保持最新。
pipreqs .
4.Python异常
用作信号通知,通知上层调用者有错误产生需要处理
try 语句
-
作用
尝试捕获异常,得到异常通知,将程序由异常状态变为正常状态
-
说明
except 子句可以有 1个或多个
except 不给错误类型,可以匹配全部的错误类型
else 子句里的语句会在 没有错误发生时执行,当处于异常时不执行
finally 子句里的语句,无论何时都执行
try:
可能发生异常的语句块
except 错误类型1 [as 变量名1]:
异常处理语句块1
except 错误类型2 [as 变量名2]:
异常处理语句块2
...
except 错误类型n [as 变量名n]:
异常处理语句块n
except:
异常处理语句块other
else:
未发生异常的语句
finally:
最终的处理语句
python
try:
number =int(input("请输入一个整数:"))
print("number=",number)
except ValueError:
print("输入的不是整数")
raise 语句
raise 异常类型
或
raise 异常对象
- 作用
抛出一个错误,让程序进入异常状态。发送错误通知给调用者。
python
def get_score():
x = int(input('请输入成绩:'))
if 0 <= x <= 100:
return x
raise ValueError('用户输入的成绩不在 0~100 之间')
try:
score = get_score()
print(score)
except ValueError as err:
print("成绩输入有误 err=", err)
err的作用就是接收raise ValueError('用户输入的成绩不在 0~100 之间')给出的提示信息
Python全部的错误类型
错误类型 | 说明 |
---|---|
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
ValueError | 传入无效的参数 |
AssertionError | 断言语句失败 |
StopIteration | 迭代器没有更多的值 |
IndexError | 序列中没有此索引(index) |
IndentationError | 缩进错误 |
OSError | 输入/输出操作失败 |
ImportError | 导入模块/对象失败 |
NameError | 未声明/初始化对象 (没有属性) |
AttributeError | 对象没有这个属性 |
<!-- 以下不常用 --> | |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
TypeError | 对类型无效的操作 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
OverflowError | 数值运算超出最大限制 |
FloatingPointError | 浮点计算错误 |
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
Exception | 常规错误的基类 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
WindowsError | 系统调用失败 |
LookupError | 无效数据查询的基类 |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError Python | 语法错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
以下为警告类型 | |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
详见:print(help(builtins))
5.Python文件操作
文件操作是Python中常见的任务之一,用于创建、读取、写入和管理文件。
打开文件
要执行文件操作,首先需要打开文件。使用open()
函数可以打开文件,指定文件名以及打开模式(读取'r'、写入'w'、追加'a')。
python
file = open('./demo1/test.txt','r')
读取文件
一旦文件被打开,可以使用不同的方法来读取文件内容。
(1)**read()**读取整个文件内容
python
file = open('./demo1/test.txt','r')
print(file.read())
(2)逐行读取文件内容
python
file = open('./demo1/test.txt','r')
for line in file:
print(line)
(3)**readlines()**读取文件的所有行,并将其作为一个列表返回。
python
file = open('./demo1/test.txt','r')
lines = file.readlines()
for line in lines:
print(line, end='\n')
写入文件
要写入文件,需要打开文件以写入模式('w'),然后使用write()
方法。
python
file = open('./demo1/test.txt','a')
file.write("Hello AI")
关闭文件
完成文件操作后,close()关闭文件,以释放资源和确保文件的完整性。
python
file = open('./demo1/test.txt','r')
file.close()
使用with
更安全的方法是使用with
语句,它会自动关闭文件。
python
with open('./demo1/test.txt','a') as file:
file.write("Hello Py")
检查是否存在
可以使用os.path.exists()来检查文件是否存在。
python
import os
file_path ='./demo1/test2.txt'
if os.path.exists(file_path):
print(f"{file_path}文件存在")
else:
print(f"{file_path}文件不存在")
处理异常
在文件操作中,可能会出现各种异常情况,例如文件不存在或没有权限。在文件操作中捕获这些异常是个好习惯。
python
try:
with open("example.txt", "r") as file:
content = file.read()
except FileNotFoundError:
print("文件不存在")
except Exception as e:
print(f"发生错误:{e}")
请根据具体需求和场景来调整代码。在进行文件操作时,要确保小心处理文件,以避免意外数据损坏或文件损坏。
复制文件
使用shutil模块的copy方法。
python
import shutil
source_file = './demo1/test.txt'
destination_file = 'test.txt'
shutil.copy(source_file,destination_file)
删除文件
要删除文件,可以使用os
模块的remove
方法。
python
file_path ='./demo1/test2.txt'
if os.path.exists(file_path ):
os.remove(file_path )
print(f"{file_path } 已删除")
else:
print(f"{file_path } 不存在")
修改名称
要改变文件名,可以使用os
模块的rename
方法。
python
file_path ='test.txt'
new_name = "new_name.txt"
if os.path.exists(file_path ):
os.rename(file_path , new_name)
print(f"文件名已更改为 {new_name}")
else:
print(f"{file_path} 不存在")
6.JSON 数据解析
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,它易于阅读和编写,同时也易于机器解析和生成。Python提供了内置的JSON模块,用于处理JSON数据。
导入模块
python
import json
序列化
json.dumps()
将 Python 对象转换为 JSON 格式的字符串。
python
import json
data = {
'name': '小明',
'age': 18,
'adress': 'CDB'
}
json_str = json.dumps(data)
print(json_str)
反序列化
json.loads()
顾名思义,功能与序列化相反:将 JSON 格式的字符串转换为 Python 对象。
python
json_str = '{"name": "\u5c0f\u660e", "age": 18, "adress": "CDB"}'
data = json.loads(json_str)
print(data)
对象存文件
json.dump()
python
data = [
{'name': '小明',
'age': 18,
'adress': 'CDB'},
{'name': '小红',
'age': 20,
'adress': 'ABC'},
]
with open('data.json', 'w') as json_file:
json.dump(data, json_file)
文件加载
python
with open('data.json','r') as json_file:
data = json.load(json_file)
print(data)
嵌套JSON
如果JSON数据包含嵌套结构,您可以使用递归来访问和修改其中的值。
python
data = {
"name": "Alice",
"info": {
"age": 25,
"location": "Paris"
}
}
# 嵌套json取值
print(data['info']['age'])
#修改嵌套json的数据
data['info']['locatin']='China'
print(data)
JSON嵌套列表
JSON可以包含列表,可以使用索引来访问列表元素。
python
data = {
"fruits": ["apple", "banana", "cherry"],
"vegetables":["tomato","potato","eggplant"]
}
# 取json嵌套列表的值
print(data["vegetables"][2])
# json嵌套的列表,其增删查改操作与列表相同
data["fruits"][1]="peach"
print(data)
JSON中的空值
JSON允许表示空值(null),在Python中通常转换为None。
python
# 在定义json空值时需要指定为None
json_data = {
"value": None
}
# 转换为json对象后,空值自动转换为null
print(json.dumps(json_data))
字典和JSON格式不同之处
数据类型限制:
JSON :支持的数据类型包括对象(类似于字典)、数组(类似于列表)、字符串、数字、布尔值和 null。JSON 不支持 Python 特有的数据类型如 tuple、set、bytes 等。
Python 字典:可以包含多种 Python 特有的数据类型,比如 tuple、set、bytes 等。
格式要求:
JSON :数据必须以字符串的形式表示,键必须是双引号括起来的字符串,值可以是字符串、数字、布尔值、数组、对象或 null。
Python 字典:键可以是任意不可变的类型(如字符串、数字、元组),值可以是任意类型。键通常用单引号或双引号括起来,但 Python 允许在字典中使用不加引号的键。