1.文件
1.1 文件编码
编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。
UTF-8是目前全球通用的编码格式
除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。
1.2 文件的读取操作
一般,文件可以分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
1.2.1 文件的操作步骤
- 打开文件
- 读写文件
- 关闭文件
可以只打开和关闭文件,不进行任何读写
1.2.2 open()打开函数
使用open()函数,可以打开一个已经存在的文件,或者创建一个新文件。
1.2.2.1 语法
open(name,mode,encoding)- name: 是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
- mode: 设置打开文件的模式(访问模式):只读、写入、追加等。
- encoding: 编码格式(推荐使用UTF-8)
复制代码 样例代码:- f = open('python.txt', 'r', encoding='utf-8')
复制代码 此时的f是open函数的文件对象,注意:此时的f是open函数的文件对象,对象是Python中一种特殊的数据类型,拥有属性和方法,可以使用对象.属性或对象.方法对其进行访问,后续面向对象课程会给大家进行详细的介绍。
1.2.2.2 mode常用的三种基础访问模式
模式描述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件。a打并一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。样例代码
- # 打开文件
- f = open("F:/Study_Python/t.txt", "r", encoding="UTF-8")
- print(type(f))
复制代码 读取文件类型:
1.2.3 read()读取文件
无论是什么读取方法,都会续接上次的内容
read()方法:
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
readlines()方法:
读取全部行
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。- # 打开文件
- f = open("F:/Study_Python/t.txt", "r", encoding="UTF-8")
- # 读取文件 - readline()
- lines = f.readlines() # 读取全部行,并封装到列表中
- print(f"lines对象的类型:{type(lines)}")
- print(f"lines的内容有:{lines}")
复制代码 若多次调用read方法时,下一个read的开头会在上一个read的结尾处
样例代码文件内容:
- 《悯农二首》
- 作者:李绅
- 春种一粒粟,秋成万颗子。
- 四海无闲田,农夫犹饿死。
- 锄禾日当午,汗滴禾下土。
- 谁知盘中餐,粒粒皆辛苦。
复制代码 样例代码:
- # 打开文件
- f = open("F:/Study_Python/t.txt", "r", encoding="UTF-8")
- # 读取文件 - read()
- print(f"读取20个字节的结果:"{f.read(20)}"")
- print(f"read读取全部内容的结果:"{f.read()}"")
复制代码 输出结果:
readline()方法:
一次读取一行
可以使用for循环读取文件行,语法:- for line in open("F:/Study_Python/t.txt", "r", encoding="UTF-8"):
- print(line)
复制代码 每一个line都是一个临时变量
1.2.4 文件关闭操作
通过close()关闭文件对象,也就是关闭对文件的占用。
!如果不调用close,同时程序没有停止运行,则这个文件就一直被Python程序占用。
语法:1.2.5 with open语法
自动完成关闭文件对象的操作
语法:- with open("F:/Study_Python/t.txt", "r", encoding="UTF-8") as f:
- for line in f:
- print(f"每一行数据是:{line}")
复制代码 输出:
1.2.6 操作汇总
操作功能文件对象= open(file, mode, encoding)打开文件获得文件对象文件对象.read(num)读取指定长度字节,不指定num读取文件全部文件对象.readline()读取一行文件对象.readlines()读取全部行,得到列表for line in文件对象for循环文件行,一次循环得到一行数据文件对象.close()关闭文件对象with open() as f通过with open语法打开文件,可以自动关闭1.3 文件的写入操作
文件流程:- # 1.打开文件
- f = open("F:/Study_Python/t.txt", "w", encoding="UTF-8")
- # 2.文件写入
- f.write('hello world!') # 写入内容
- # 3.内容刷新
- f.flush() # 刷新内容到硬盘中
- # 4.close关闭
- f.close() # 内置了flush的功能
复制代码 注意:
- 直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容会真正写入文件
- 这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
- w模式:
- 文件不存在:创建新文件,进行写
- 文件存在:清空原文件内容,再写入
1.4 文件的追加写入操作
文件流程:- # 1.打开文件
- f = open("F:/Study_Python/t.txt", "a", encoding="UTF-8")
- # 2.文件写入
- f.write('hello world!')
- # 3.内容刷新
- f.flush()
- # 4.close关闭
- f.close() # 内置了flush的功能
复制代码 a模式:
- 文件不存在:创建文件
- 文件存在:在文件末尾追加写入文件
2.异常模块与包
2.1 异常
程序正常执行过程中出现的不正常的情况,该情况影响了程序的正常执行。
简单案例:- # 读取一个不存在的文件
- f = open("F:/Study_Python/t1.txt", "r", encoding="UTF-8")
复制代码 输出结果:
2.2 异常的捕获
程序遇到异常的两种情况:
- 整个程序因为Bug停止运行
- 对Bug进行提醒,整个程序继续运行
捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段。
2.2.1 基本语法:
- try:
- 可能发生错误的代码
- except:
- 如果出现异常执行的代码
复制代码 简单案例:- try:
- f = open("F:/Study_Python/t1.txt", "r", encoding="UTF-8")
- except:
- print("由于文件不存在,出现异常,修改open模式")
- f = open("F:/Study_Python/t1.txt", "w", encoding="UTF-8")
复制代码 输出结果:
2.2.2 捕获指定异常
基本语法:- try:
- print(name)
- except NameError as e:
- print('name变量名称未定义错误')
复制代码 2.2.3 捕获多个异常
当捕获多个异常时,可以把要捕获的异常类型的名字,放到except后,并使用元组的方式进行书写。- try:
- print(1/0)
- except (NameError, ZeroDivisionError):
- print('ZeroDivision错误...')
复制代码 2.2.4 捕获全部异常
- # 捕获全部异常
- try:
- print(1 / 0)
- except Exception as e:
- print(f"出现异常:{e}")
复制代码 2.2.5 异常else
else表示的是如果没有异常要执行的代码。- try:
- print(1)
- except Exception as e:
- print(e)
- else:
- print("我是else,是没有异常的时候执行的代码")
复制代码 2.2.6 异常finally
finally表示的是无论是否异常都要执行的代码,如关闭文件。- try:
- f = open("t.txt", "r")
- except Exception:
- f = open("t.txt", "w")
- else:
- print("我是else,是没有异常的时候执行的代码")
- finally:
- print("我是finally,无论有没有异常,我都会执行的代码")
- f.close()
复制代码 输出结果:
2.2.7 异常的传递性
异常是具有传递性的
当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02,当func02也没有捕获处理这个异常的时候main函数会捕获这个异常,这就是异常的传递性.
图:黑马程序员
当所有函数都没有捕获异常的时候,程序就会报错
3.模块
Python模块就是一个Python文件,以 .py 结尾
模块能定义函数,类和变量,模块内也可以包含可执行的代码
3.1 模块的导入方式
- [from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名]
复制代码
- 常用的组合形式如:
- import 模块名
- from 模块名 import 类、变量、方法等
- from 模块名 import *
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
- 基本语法:
- import 模块名
- import 模块名1,模块名2
- 模块名.功能名()
复制代码 案例代码:- # # 使用import导入
- # import time
- #
- # print("开始1")
- # time.sleep(1)
- # print("结束1")
- #
- # # 使用from导入sleep的具体功能
- # from time import sleep
- #
- # print("开始2")
- # sleep(5)
- # print("结束2")
- # # 使用from导入sleep的全部功能
- # from time import *
- # print("开始3")
- # sleep(5)
- # print("结束3")
- # 使用as给特定功能加上别名 给特定功能改名
- # from time import sleep as s
- # print("开始4")
- # s(5)
- # print("结束4")
复制代码 3.2 自定义模块
每个Python文件都可以作为一个模块,模块的名字就是文件的民资,也就是说自定义模块名必须要符合标识符命名规则
当导入多个模块时,且模块内有同名功能,当使用这个同名功能时,调用的是,后面导入的模块的功能。
3.3 __main__
当一个 Python 模块或包被导入时,__name__ 会被设为模块的名称。
调用模块时,不会执行__main__相关代码,但在执行模块本身文件时,会执行__main__相关代码
if _main_== "_main_"表示,只有当程序是直接执行的才会进入if内部,如果是被导入的,则if无法进入
3.4 __all__
如果一个模块文件中有_all_变量,当使用from xxx import()导入时,只能导入这个列表中的元素
如上代码:只能导入test_A()
4.包
包,就是里面装了一个__init__.py文件的文件夹,该文件夹可用于多个模块文件。
包的本质就是模块
步骤:
- 新建包my_package
- 新建包内模块:my_module1和my_module2
- 定义模块内代码
新建包后,包内部会自动创建_——int__.py文件,这个文件控制包的导入行为。
4.1 导入包
可使用__all__变量,控制 import *
4.1.1 方式一
4.1.2 方式二
4.1.3 方式三
4.2 安装第三方包
一个包,就是一堆同类型功能的集合体
在命令提示符程序内输入:
pip install 包名称
即可通过网络快速安装第三方包
4.2.1 pip的网络优化
我们可以通过如下命令,让其连接国内的网站进行包的安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |