课堂笔记
1. 异常简介
程序在运⾏过程中可能会出现⼀些错误。⽐如: 使⽤了不存在的索引,两个不 同类型的数据相加…这些错误我们称之为异常
处理异常 程序运⾏时出现异常,⽬的并不是让我们的程序直接终⽌!Python 是希望在出现异常时,我们可以编写代码来对异常进⾏处理
# 在程序运行过程当中,不可避免出现一些错误例如 用没有赋值过的变量。类型不同做加法运算..
# 异常以后的代码都不会执行
# print(a) # NameError: name 'a' is not defined
# print(10/0) # ZeroDivisionError: division by zero
# print('hello')
# print(10 / 0)
# print('python')
# 处理异常
# 程序运行时出现异常,目的并不是要终止我们的程序
# Python是希望出现异常时,我们可以编写代码来对异常进行处理
# try语句
# try:
# 代码块 (可能出现错误的语句)
# except 异常类型 as 异常名:
# 代码块 (出现错误之后的处理方式)
# except 异常类型 as 异常名:
# 代码块 (出现错误之后的处理方式)
# except 异常类型 as 异常名:
# 代码块 (出现错误之后的处理方式)
# .....
# finally:
# 代码块
# else:
# 代码块 (没有出错要执行的语句)
print('hello')
try:
print(10 / 2)
except:
print('出错了兄弟.....')
else:
print('程序正常执行没有错误')
print('python')
2. 异常的传播
当在函数中出现异常时,如果在函数中对异常进⾏了处理,则异常不会在进 ⾏传播。如果函数中没有对异常进⾏处理,则异常会继续向函数调⽤传播。 如果函数调⽤处处理了异常,则不再传播异常,如果没有处理则继续向调⽤ 处传播。直到传递到全局作⽤域(主模块)如果依然没有处理,则程序终⽌,并 显示异常信息。
当程序运⾏过程中出现异常以后,所有异常信息会保存到⼀个异常对象中。 ⽽异常传播时,实际上就是异常对象抛给了调⽤处
# 异常的传播
# 当在函数中出现异常时,如果在函数中处理了异常。则异常不会在继续传播
# 如果在函数中没有处理异常,则异常会继续向函数调用出传播
# 如何函数调用处处理了异常,则不在传播。如果没有处理则继续向调用处传播
# 直到传递到全局作用域(主模块)如果依然没有处理,则呈现终止,并显示异常信息
# 当程序运行过程中,出现异常以后,所以的异常信息会被保存到一个专门的异常对象当中
# 而异常传播时,实际上就是异常对象抛给了调用处
# def fn():
#
# print('hello fn')
# print(10 / 0)
#
# try:
# fn()
#
# except:
# pass
def fn():
print('hello fn')
print(10 / 0)
def fn2():
print('hello fn2')
fn()
def fn3():
print('hello fn2')
fn2()
# fn3()
print(NameError)
--------------------------------------------------------------------------
print('异常出现前')
lst = []
try:
# print(a)
# lst + 'hello'
print(10/0)
# except NameError:
# # except后不跟任何内容,此时它会捕获所有的异常
# # print('处理异常的逻辑....')
# print('出现 NameError异常了')
# except ZeroDivisionError:
# # except后不跟任何内容,此时它会捕获所有的异常
# # print('处理异常的逻辑....')
# print('出现 ZeroDivisionError异常了')
except Exception as e:
# Exception 是有所有异常类的父类 所有如果except后跟Exception 它会捕获到所有的异常
print('出现异常了',e,type(e))
finally:
print('无论是否出现异常,该语句都会执行')
print('异常出现后')
3. 异常对象
1 try语句
2 try:
3 代码块(可能出现错误的语句)
4 except 异常类型 as 异常名:
5 代码块(出现错误以后的处理⽅式)
6 except 异常类型 as 异常名:
7 代码块(出现错误以后的处理⽅式)
8 except 异常类型 as 异常名:
9 代码块(出现错误以后的处理⽅式)
10 ....
11 else:
12 代码块(没出错时要执⾏的语句)
13
14 finally:
15 代码块(是否出错该代码块都会执⾏)
16 try是必须的 else有没有都可以
17 except和finally⾄少有⼀个
18
4. ⽂件打开
⽂件(file) 通过Python程序来对计算机中的各种⽂件进⾏增删改查的操作 ⽂ 件也叫I/O(Input/Output)
⽂件的操作步骤
打开⽂件
对⽂件进⾏各种操作(读、写)然后保存
关闭⽂件
⽂件会有⼀个返回值。返回⼀个对象,这个对象就表示的是当前的⽂件
# 文件(File)(IO Input/Output)
# 通过Python程序对计算机的各种文件进行增删改查的操作
# 操作文件的步骤 1.打开文件 2.对文件进行各种操作(读写)然后保存 3.关闭文件
# open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# 返回值 返回了一个对象 这个对象代表的就是当前打开的文件
# 如果目标文件和当前文件在同一级目录下,直接使用文件名即可
file_name = 'demo.txt'
file_name = 'D:\JerryProject\基础\demo.txt'
file_obj = open(file_name) # 打开对应的文件
print(file_obj)
-----------------------------------------------------------------------------
file_name = 'demo4.txt'
with open(file_name,'x',encoding='utf-8') as file_obj:
# write()来向文件中写入内容
# 如果操作的是一个文本文件的时候,则需要传递一个字符串作为参数
# r表示只读
# w表示可以写
# a表示追加
# x 表示用来创建新的文件,如有文件不存在则创建,如果存在就报错
# FileExistsError: [Errno 17] File exists: 'demo.txt'
# file_obj.write('nice to meet you') # io.UnsupportedOperation: not writable
file_obj.write('abc\n')
file_obj.write('def')
file_obj.write('wxy')
r = file_obj.write(str(123)+'\n') # TypeError: write() argument must be str, not int
print(r)
---------------------------------------------------------------------------
file_name = 'demo.txt'
with open(file_name,encoding='utf-8') as file_obj:
# print(file_obj.read())
# readline()该方法用来读取一行的内容
# print(file_obj.readline(),end='')
# print(file_obj.readline())
# print(file_obj.readline())
# readlines() 它会一次性读取文件内容以列表形式返回
r = file_obj.readlines()
print(r[0])
-------------------------------------------------------------------------------
file_name = 'demo.txt'
try:
with open(file_name,encoding='utf-8') as file_obj:
# 定义一个变量 来保存结果
file_content = ''
# 定义一个变量 指定每次读取的大小
chunk = 100
# 创建一个循环来读取内容
while True:
content = file_obj.read(chunk)
# 检查是否读完文件
if not content:
# 内容读取完毕退出循环
break
# print(content,end='')
file_content += content
except FileNotFoundError:
print(f'{file_name}文件不存在.....')
print(file_content,end='')
5. 关闭⽂件
调⽤close()⽅法来关闭⽂件
with…as 语句不⽤写close()来关闭。它⾃带关闭
# file_name = 'demo.txt'
# file_obj = open(file_name)
#
# # read()函数 用来读取文件的内容,它会将内容全部保存到一个字符串返回
#
# content = file_obj.read()
#
# print(content)
#
# # 关闭文件
# # 调用close()函数来关闭文件
# file_obj.close()
# file_obj.read() # ValueError: I/O operation on closed file.
# with...as...语句 不用写close()
file_name = 'demo.txt'
try:
with open(file_name) as file_obj:
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name}文件不存在.....')
# print(file_obj.read()) ValueError: I/O operation on closed file.
6. 读取⽂件
通过read()来读取⽂件的内容
调⽤open()来打开⼀个⽂件,可以将⽂件分为2中类型 ⼀种 纯⽂本⽂件(使⽤utf-8编码编写的⽂件) ⼀种 ⼆进制⽂件(图⽚ mp3 视频…) open()打开⽂件时,默认是以⽂本⽂件的形式打开的 open()默认的编码 为None。所以处理⽂本⽂件时要指定编码
# 调用open()函数打开一个文件时,可以将文件分为2种类型
# 一种纯文本
# 一种是二进制文件
file_name = 'demo2.txt'
try:
with open(file_name,encoding='utf-8') as file_obj:
# 对于较大的文件不要直接使用read()
# help(file_obj.read)
content = file_obj.read(6)
content = file_obj.read(6)
content = file_obj.read(6)
content = file_obj.read(6)
print(content)
print(len(content))
except FileNotFoundError:
print(f'{file_name}文件不存在.....')
7. 较⼤⽂件的读取
通过read()读取⽂件内容时会将⽂件中所有的内容全部读取出来。如果对于 读取的⽂件⽐较⼤的话。会⼀次性的将⽂件加载到内容中。容易导致内存泄 露。所以对于较⼤的⽂件。不要直接调⽤read()
read()可以接收⼀个size作为的参数。该参数⽤来指定要读取字符的数量。默 认值为-1.-1也就是要读取全部的内容 每次读取都会从上次读取到的位置开始。如果字符的数量⼩于size。则会读 取所有的。如果读取到最后的⽂件。则会返回空串
readline() 该⽅法⽤来读取⼀⾏
readlines() 该⽅法⽤于⼀⾏⼀⾏的读取内容,它会⼀次性将读取到的内容封 装到⼀个列表当中返回
8. ⽂件的写⼊
write()来向⽂件中写⼊内容
该⽅法可以分多次向⽂件写⼊内容
写⼊完成之后该⽅法会返回写⼊的字符的个数
使⽤open()函数打开⽂件时,必须要指定打开⽂件要做的操作(读、写、追 加)。如果不指定操作类型,则默认是读取⽂件,⽽读取⽂件是不能向⽂件中 写⼊
r 表示只读
w表示可以写。使⽤w写⼊⽂件时,如果⽂件不存在则会创建⼀个⽂件。 如果⽂件存在则会覆盖原⽂件内容
9. ⼆进制⽂件写⼊
读取⽂本⽂件时,size是以字符为单位。读取⼆进制⽂件时,size是以字节 为单位
我们⽤wb来写⼊⼆进制⽂件
10.csv文件的操作
#写入
import csv
with open('test.csv','a', newline='',encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['4', '猫砂', '25', '1022', '886'])
writer.writerow(['5', '猫罐头', '18', '2234', '3121'])
------------------------------------------------------------
#读出
import csv
with open('test.csv', newline = '', encoding = 'utf-8') as f:
#参数encoding = 'utf-8'防止出现乱码
reader=csv.reader(f)
for row in reader:
print(row)
我们也可以用这种方式自学:dir(x),可以查询到x相关的函数,x可以是模块,也可以是任意一种对象。
# 请直接运行并体验代码
a = '' # 设置一个字符串
print('字符串:')
print(dir(a)) # 把字符串相关的函数展示出来
a = [] # 设置一个列表
print('列表:')
print(dir(a)) # 把列表相关的函数展示出来
a = {} # 设置一个字典
print('字典:')
print(dir(a)) # 把字典相关的函数展示出来
11.random模块/time模块
import random # 调用random模块
a = random.random() # 随机从0-1之间(包括0不包括1)抽取一个小数
print(a)
a = random.randint(0,100) # 随机从0-100(包括0和100)之间抽取一个数字
print(a)
a = random.choice('abcdefg') # 随机从字符串,列表等对象中抽取一个元素(可能会重复)
print(a)
a = random.sample('abcdefg', 3) # 随机从字符串,列表等对象中抽取多个不重复的元素
print(a)
items = [1, 2, 3, 4, 5, 6] # “随机洗牌”,比如打乱列表
random.shuffle(items)
print(items)
--------------------------------------------------------------
# 请直接运行并体验代码
import random # 调用random模块
print(dir(random))
--------------------------------------------------------
import time
print('第一句话,过两秒出现第二句。')
time.sleep(2)
print('第二句话。')
===================================================
time模块和random模块是Python的系统内置模块,也就是说Python安装后就准备好了这些模块供你使用。
此外,Python作为一门胶水语言,一个强大的优势就是它拥有许多第三方的模块可以直接拿来使用。
如果是第三方编写的模块,我们需要先从Python的资源管理库下载安装相关的模块文件。
下载安装的方式是打开终端,Windows用户输入pip install + 模块名;苹果电脑输入:pip3 install + 模块名,点击enter即可。(需要预装python解释器和pip)
比如说,爬虫时我们会需要用到requests这个库(库是具有相关功能模块的集合),就需要在终端输入pip3 install requests(Mac用户)的指令。
=====================================================
自编模块的导入演示
story.py
sentence = '从前有坐山,'
def mountain():
print('山里有座庙,')
class Temple:
sentence = '庙里有个老和尚,'
def reading(self):
print('在讲一个长长的故事。')
------------------------------------------------------------------------------------
main.py
import story
if __name__ == '__main__':
print(story.sentence)
story.mountain()
A = story.Temple()
print(A.sentence)
A.reading()
print()