python基础4_文件+异常相关
文章目录
一、 文件操作
1.1 文件的编码
编码技术,即翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容
计算机中有许多可用编码,不同的编码,将内容翻译成的二进制也是不同的,因此要使用正确的编码,才能对文件进行正确的读写操作
为什么要使用编码?计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中;同时也需要编码,将计算机保存的0和1,反向翻译回可以识别的内容
1.2 文件的读取
一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别
文件的操作步骤:打开文件、读写文件、关闭文件(注:可以只打开文件、关闭文件,不读写文件)
-
open()打开文件
-
语法:open(name, made, encoding)
-
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)
-
mode:设置打开文件的模式(访问模式),见下表
模式 描述 r 以只读方式打开文件。文件的指针将会放在文件的开头(默认模式) w 打开一个文件只用于写入。如果该文件已经存在则打开文件,并从头开始编辑,原有内容会被删除;如果该文件不存在,创建新文件 a 打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后;如果该文件不存在,创建新文件进行写入 -
encoding:编码格式(推荐使用UTF-8)
-
示例:
f = open('python.txt', 'r', encoding = 'UTF-8') # encoding的顺序不是第三位,所以不能用位置参数,用关键字参数直接指定 # 此时的‘f’是open函数的文件对象,对象是python中一种特殊的数据类型,拥有属性和方法,可以使用对象.属性或者对象.方法对其进行访问
-
-
-
读操作相关方法:
-
read():
- 文件对象.read(num)
- num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中的所有的数据
-
readlines():
-
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素
-
示例:
f = open("python.txt") content = f.readlines() print(content) # ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
-
-
readline():
-
一次读取一行内容
-
示例:
f = open("python.txt") content = f.readline() print("第一行:{}".format(content)) content = f.readline() print("第二行:{}".format(content))
-
-
for循环读取文件行:
for line in open("python.txt", "r"): print(line) # 每一个line临时变量,就记录了文件的一行数据
-
-
close()关闭文件对象
f = open('python.txt', 'r', encoding = 'UTF-8') f.close()
- 最后通过close,关闭文件对象,也就是关闭对文件的占用
- 如果不调用close,同时程序没有停止运行,那么这个文件将一直被python程序占用
-
with open 语法:
with open('python.txt', 'r') as f: f.readlines()
- 通过在with open的语句块中对文件进行操作
- 可以在操作完成后自动关闭文件,避免遗忘掉close方法
-
操作汇总:
操作 功能 文件对象 = open(name, mode, encoding) 打开文件获得文件对象 文件对象.read(num) 读取指定长度字节;不指定num读取文件全部 文件对象.readline() 读取一行 文件对象.readlines() 读取全部行,得到列表 for line in 文件对象 for循环文件行,一次循环得到一行数据 文件对象.close() 关闭文件对象 with open() as f 通过with open语法打开文件,可以自动关闭 -
示例:
f = open("D:/word.txt", "r", encoding="UTF-8") cnt = 0 for line in f: my_list = line.split(" ") for e in my_list: if e=="itheima" or e=="itheima\n": cnt += 1 print(line, cnt) print(cnt) f.close()
1.3 文件的写入
示例:
# 1. 打开文件
f = open("D:/word.txt", "w")
# 2. 文件写入
f.write("hello world")
# 3. 内容刷新
f.flush()
- 直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容会真正写入文件
- 这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
- 写入文件使用open函数的“w”模式进行写入;文件不存在,会创建新文件;文件存在,会清空原有内容
- close()方法,带有flush()方法的功能
1.4 文件的追加
示例:
# 1. 打开文件,通过a模式打开即可
f = open("D:/word.txt", "a")
# 2. 文件写入
f.write("hello world")
# 3. 内容刷新
f.flush()
- a模式,文件不存在会创建新文件;文件存在,在最后追加写入文件
- 可以使用“\n”来写出换行符
二、 异常、模块与包
2.1 了解异常
当检测到一个错误时,python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG
2.2 异常的捕获方法
-
为什么要捕获异常?
- 任何程序在运行的过程中都有可能出现异常,导致程序无法完美运行下去;因此,我们要在力所能及的范围内,对可能出现的bug进行提前准备、提前处理,这种行为我们称之为“异常处理/捕获异常”
- 捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常时,可以有后续手段
-
捕获常规异常:
-
基本语法:
try: 可能发生错误的代码 except: 如果出现异常执行的代码
-
示例:
# 以r模式打开文件,如果文件不存在,则以w方式打开 try: f = open("text.txt", "r") except: f = open("text.txt", "w")
-
-
捕获指定异常:
-
基本语法:
try: 可能出现错误的代码 except NameError as e: 如果出现异常执行的代码
-
注意事项:
- 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
- 一般try下方只放一行尝试执行的代码
-
-
捕获多个异常:
-
基本语法:
# 当捕获多个异常时,可以把要捕获的异常类型的名字,放到expect后,并使用元组进行书写 try: print(1/0) except (NameError, ZeroDivisionError): print("Error......")
-
-
捕获所有异常:
try: 可能出现错误的代码 except Exception as e: 如果出现异常执行的代码
-
异常else:
# else表示的时如果没有异常要执行的代码 try: print("1") except Exception as e: print(e) else: print("没有异常")
-
异常的finally:
# finally表示的是无论是否异常都要执行的代码,例如关闭文件等等 try: f = open("text.txt", "r") except Exception as e: f = open("text.txt", "w") else: print("没有异常") finally: f.close()
2.3 异常的传递
异常是具有传递性的
2.4 python模块
2.4.1 模块的导入
-
什么是模块
- python模块,是一个python文件,以.py结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码
- 模块的作用:python中有很多各种不同的模块,每一个模块都可以帮助我们快速地实现一些功能;我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能
-
模块的导入方式:
-
import 模块名:
import moduleName moduleName.funcName()
-
from 模块名 import 类、变量、方法等:
from moduleName import funcName funcName()
-
from 模块名 import *
-
from 模块名 as 别名:
from noduleName as otherName otherName.funcName()
-
from 模块名 import 功能名 as 别名:
from moduleName import funcName as otherName otherName()
-
-
注意:
- from可以省略,直接import即可
- as别名可以省略
- 通过“.”来确定层级关系
- 模块的导入一般写在代码文件的开头位置
2.4.2 自定义模块
-
每个python文件都可以作为一个模块,模块的名字就是文件的名字,也就是说,自定义模块的名字必须要符合标识符命名规则
-
测试模块:
-
在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,开发人员会自行在py文件中添加一些测试信息
def test(a, b): print(a+b) test(1,1)
-
问题:此时,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行test函数的调用
-
解决方案:
def test(a, b): print(a+b) # 只在当前文件中调用该函数,其他导入的文件内将不再执行 if __name__ == '__main__': test(1,1)
-
-
如果一个模块文件中有“_ all _”变量,当使用“from xxx import *”导入时,只能导入这个列表中的元素
-
不同模块,同名的功能,如果都被导入,那么后导入的会覆盖先导入的
2.5 python包
-
什么是python包
- 从物理上看,包就是一个文件夹,在该文件夹下包含了一个_ init _.py文件,该文件可用于多个模块文件
- 从逻辑上看,包的本质依然是模块
- 包的作用:当我们的模块文件越来越多,包可以帮助我们管理这些模块,包的作用就是包含多个模块,但包的本质依然是模块
-
具体步骤:
- 新建包
- 新建包内模块
- 模块内代码
- (注意:新建包后,包内部会自动创建_ init _.py文件,这个文件控制着包的导入行为
-
导入包:
-
方式一:
import 包名.模块名 包名.模块名.目标
-
方式二:
from 包名 import * 模块名.目标 # 必须在_ _init_ _.py文件中添加__all__ = [],控制允许导入的模块列表
-
2.6 安装第三方python包
- 什么是第三方包
- 在python程序的生态中,有许多非常多的第三方包(非python官方),可以极大地帮助我们提高开发效率
- 科学计算中常用的:numpy包
- 数据分析中常用的:pandas包
- 大数据计算中常用的:ptspark、apache-flink包
- 图形可视化常用的:matplotlib、pyecharts
- 人工智能常用的:tensorflow
- 等等
- 由于是第三方,所以python没有内置,所以我们需要安装它们才可以导入使用
- 在python程序的生态中,有许多非常多的第三方包(非python官方),可以极大地帮助我们提高开发效率
- 安装第三方包——pip
- 打开 命令提示符程序,里面输入:pip install 包名称,即可通过网络快速安装第三方包
- pip的网络优化:
- 由于pip是连接的国外的网站进行包的下载,所以有时速度会很慢
- 可以通过如下命令,让其连接国内的网站进行包的安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
- 上网站是清华大学提供的一个网站,可供pip程序下载第三方包