文章目录
1. 异常处理
1.1 错误
错误:
语法错误
代码-不符合Python基本语法,解释器无法运行代码
def test: pass
逻辑错误
代码在逻辑上不完整、不严谨,存在漏洞
通过数据测试完成复杂逻辑错误验证
# 使用input接收外部输入,采用字符串处理方式对输入数据进行判断 num = input('>>:') if isinstance(int(num), int): print('int') else: print('Error')
1.2 异常
异常出现后,无法运行后续代码,会产生程序中断
Python中可以采用if条件判断处理异常。以及捕获异常的方式
try: 被执行的代码块 except 异常的类型: 执行异常处理的代码
try: data = int(input(':>>')) print(data) except ValueError: print('Error')
实例代码
''' try...except编写程序 string = 'try except' 转换为迭代器对象,之后采用next方法访问内部元素若干次,将其封装在函数之内 StopIteration: 迭代器没有更多的值 ''' def iterFunc(string): iterStr = iter(string) while True: try: print(next(iterStr)) except StopIteration: print('迭代完成!') break if __name__ == '__main__': data = input(':>>') iterFunc(data)
完整的异常处理语法
try: code # 期望执行的代码 except <异常类型1>: code2 except <异常类型2> as e: print(e) code3 else: code4 #在未发生异常时执行code4
异常处理多路分支实例
try: msg = input(':>>') data = int(msg) # ValueError # print(x) # NameError # data = [1,2] # data[10] # IndexError # # 1+'abc' # TypeError except ValueError as e: print(e, type(e)) except NameError: print('NameError') else: print(data)
万能异常
Exception:可以捕获任意异常
S1 = 'hello' try: data = int(s1) except Exception as e: print(e) else: print(data)
完整的异常处理
S1 = 'hello' try: data = int(S1) except IndexError as e: print(e) except ValueError as e: print(e) except NameError as e: print(e) else: print('try内代码没有发生异常,执行!') finally: print('无论异常与否,都会执行改代码!通常执行清理工作!') ''' invalid literal for int() with base 10: 'hello' 无论异常与否,都会执行改代码!通常执行清理工作! '''
raise主动触发异常
语法:
raise [Exception[, args...]]
Exception:为异常类型,参数可省略
args: 可传参数
try: raise TypeError('类型错误') except Exception as e: print(e)
自定义异常
异常类由自己创建,实现灵活的异常处理方式
# 1. 自定义异常处理类型:NewException, 设定传入的异常信息‘msg’, 功能为返回‘msg’即可 # 2. 使用自定义异常,实现判断输入字符串长度是否大于3,成立,则主动抛出NewException, # 同时采用异常捕获方式,当捕获到异常时,输出‘使用NewException捕获’ # 如果没有捕获到异常,输出'没有异常产生' # NewException继承Exception class NewException(Exception): def __init__(self,msg): self.msg = msg def __str__(self): return self.msg+'__str__方法实现' try: data = input(':>>') if len(data)>3: raise NewException('New Exception') except NewException as e: print(e)
assert断言
assert用于判断一个表达式是否为真,当表达式为假时,执行异常处理
assert 表达式
等价于
if not 表达式:
raise AssertionError
assert True # 条件为True,不处理 # assert False # 条件为False,处理 assert 1==1 assert 1==2 print('hello world') ''' Traceback (most recent call last): File "E:/PythonProject/上课/实训课/2002正式班/day16_异常处理与文件读写/Demo.py", line 104, in <module> assert 1==2 AssertionError ''' ''' assert如果不成立后面代码不会执行 ''' import sys assert('linux' in sys.platform) # 该代码只能运行在Linux平台下
try…except与if…else
- 前一种方式在异常处理方面可替代第二种方式
- 第一种方式,可以把错误处理于正常执行的代码明确的划分出来,同时在处理复杂工作任务时容易实现
- 啥时候用异常处理:
- try…except 本身会增加代码的处理逻辑,与正常工作无关,尽量少用
异常汇总
- Error
- AttributeError
- 试图访问一个数据对象没有的属性,例如 foo.x 但是foo没有x属性
- IOError
- 输入/输出异常,基本上就是文件无法打开
- ImportError
- 无法导入模块或包,考虑路径、文件名问题
- IndentationError
- 语法错误(的子类),考虑代码对齐
- IndexError
- 下标引用越界,比如x只有仨元素,访问了x[5]
- KeyError
- 字典中不存在的键
- KeyboardInterrupt
- Ctrl + c: 触发了一个系统内核级别的中断(kill -9)
- NameError
- 访问一个没有申请姓名的标识符
- SyntaxError
- python代码非法,解释器无法解释语法错误的代码
- TypeError
- 传入对象类型与要求不匹配
- UnboundLocalError
- 视图访问一个未被设置局部变量,有同名全局变量访问导致的错误
- ValueError
- 传入一个调用者未期望的数值
- BaseException
- 所有异常的基类
- SystemExit
- 解释器请求退出
- Exception
- 常见异常的基类
- StopIteration
- 迭代器没有更多的值
- GeneratorExit
- 生成器发生异常并退出
- StandardError
- 所有的内建标准异常的基类
- FloatPointError
- 浮点数计算错误
- OverflowError
- 数值运算超出了最大的限制
- ZeroDivisionError
- 除零
- AssertionError
- 断言失败
- EnvironmentError
- 操作系统错误的基类
- OSError
- 操作系统错误
- WindowsError
- 系统调用失败
- LookupError
- 无效的查询的基类
- MemoryError
- 内存溢出,相对python不致命
- RuntimeError
- 运行时错误
- UnicodeError
- Unicode设置错误
- UnicodeDecodeError
- Unicode解码错误
- UnicodeEncodeError
- Unicode编码错误
- UnicodeTranslateError
- Unicode 转换时错误
- Warning
- DeprecationWarning
- 被弃用的特征的警告
- FutureWarning
- 关于构造将来语义会导致的警告
- OverflowWarning
- 旧语法-python2中数据类型long–长整形
- UserWarning
- 用户代码生成的警告
- SytaxWarning
- 可疑的语法警告
2. 文件操作
2.1 文件操作
文件操作
利用函数open(),实现对一个文件进行读写,函数会返回一个句柄
针对句柄可以完成各种操作
file = open('路径+文件名', mode=‘文件打开方式’, encoding='文件编码格式')
- 利用file句柄可以完成文件各种操作
mode=r,w,a/ r+ w+ a+/ rb wb ab/ rb+ wb+ ab+
操作文件的方式
''' 方法一: ''' # 打开文件并获取句柄 file = open('Demo.py', mode='r', encoding='utf-8') # 通过句柄读取文件 print(file.read(100)) # 关闭打开的句柄 file.close()
''' 方法二: ''' # 打开文件并获取句柄, with... as file语法自动关闭句柄 with open('Demo.py', mode='r', encoding='utf-8') as file: # 通过句柄读取文件 print(file.read(100))
任务: 在系统终端调用系统关键字,并重定向到本地文件夹,命名问keyword.txt, 并读取数据
terminal下 python -c “import this”
2.2 读文件
read(): 将文件中全部内容进行读取。特点-耗内存
read(n): 读取n个字符,
- 注意:每次重复读取时,从当前位置继续向下读
- 如果mode=‘rb’ ,读取的内容单位为字节(中文:utf-8 一个中文三个字节,gbk一个中文两个字节)
readline(): 一次读一行,每次读取出来的数据都带换行符’\n’, 字符串处理strip()
readlines(): 将每一行形成一个元素,放到列表中,将内容读取出来。特点-耗内存
file = open('./Demo.py',mode='rb') content = file.read(120) print(content.decode('utf-8')) file.close()
2.3 写文件
文件不存在-创建并写入
文件存在,覆盖原始内容
file = open('./zen.txt',mode='w', encoding='utf-8') file.write('test') file.close()
思考题
考虑使用二进制读写方式将数据以 mode=‘wb’方式 写入数据’涪陵榨菜’
file = open('./test.txt',mode='wb') file.write('涪陵榨菜'.encode('utf-8')) file.close()
2.4 追加
a,ab 追加写入普通字符串和二进制字节码
追加写入九九乘法表到test.txt中
file = open('./test.txt',mode='a') for row in range(1,10): for column in range(1,row+1): file.write('%2d * %2d = %2d\t'%(row, column, row*column)) file.write('\n') file.close()
2.5 读写
mode = ‘rb+’, ‘r+’
file = open('test.txt', mode='r+', encoding='utf-8') content = file.read() file.write('~~~~~~~~~~~new data!') print(content) file.flush() file.close()
2.6 写读
mode = ‘w+’ ,‘wb+’
file = open('test.txt', mode = 'w+', encoding='utf-8') file.write('$$$$$$$$$$$$$$$$$$$$ new data2!') content = file.read() print(content) file.flush() file.close()
2.7 追加读
mode = ‘a+’,‘ab+’
2.8 seek\tell
seek(n) 移动光标n个位置,移动单位为字节码bytes,utf-8中文需要移动3个bytes
- 通常用seek()都是移动到开头或结尾位置
- 开头:seek(0)
- 结尾:seek(0,2)
- seek函数第二个参数:
- 0-开头
- 1-当前位置
- 2-文件结尾
tell():可实现获取当前光标位置,带返回值,返回单位也是bytes
file = open('test.txt', mode='r+', encoding='utf-8') # 文件开头 file.seek(0) content = file.read() print('content1:',content) file.seek(0) # 文件结尾 file.seek(0,2) content2 = file.read() print('content2:',content2) file.seek(0) file.write('新内容') print(file.tell()) file.close()
3. 练习题
'''
1. 创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
2. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png), 将当前img目录所有以.png结尾的后缀名改为.jpg
3. 读取文件并计算平均分
4. 京东笔试题
1) 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip;
2)读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
5. 每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1‐‐33中选择;蓝色球号码从1‐‐16中选择
'''
ad()
print(‘content2:’,content2)
file.seek(0)
file.write(‘新内容’)
print(file.tell())
file.close()
3. 练习题
'''
1. 创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
2. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png), 将当前img目录所有以.png结尾的后缀名改为.jpg
3. 读取文件并计算平均分
4. 京东笔试题
1) 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip;
2)读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
5. 每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1‐‐33中选择;蓝色球号码从1‐‐16中选择
'''
1. 创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
import random #导入随机变量模块
filename = r".\data.txt" #首先创建一个文件名字为data.txt
with open(filename , "w") as file: #用with as 方法打开这个文件
for i in range(100000): #做一个循环
file.write(str(random.randint(1,100)) + "\n") #将随机生成的数,换行输入到文件中
2. 在当前目录新建目录img,里面包含100个文件,100个文件名各不相同(X4G5.png),将当前img目录所有
以.png结尾的后缀名改为.jpg
import random
import string
import os
# 生成一个文件名
def gen_code():
#随机生成4位验证码
li = random.sample(string.ascii_letters+string.digits,4)
return ''.join(li)
def create_files():
#使用列表生成式随机生成100个验证码
li = [gen_code() for i in range(100)]
#创建文件夹
os.mkdir('img')
#生成100个文件
for i in li:
with open("img/" + i + ".png", "a+") as fp:
pass
create_files()
def modify_suffix(dirname, old_suffix, new_suffix):
# :param dirname: 要操作的目录或文件夹
# :param old_suffix: 旧的后缀名
# :param new_suffix: 新的后缀名
#找出以png结尾的文件名
png_file = filter(lambda filename: filename.endswith(old_suffix), os.listdir(dirname))
# 分离文件名和后缀
base_files = [file.split(".")[0] for file in png_file]
print(base_files[0])
# 文件重命名
for filename in base_files:
old_name = os.path.join(dirname, filename + old_suffix)
new_name = os.path.join(dirname, filename + new_suffix)
os.rename(old_name, new_name)
modify_suffix("img", ".png", ".jpg")
3. 读取文件并计算平均分
import random #导入随机变量模块
filename = r".\data.txt" #首先创建一个文件名字为data.txt
with open(filename , "w") as file: #用with as 方法打开这个文件
for i in range(100000): #做一个循环
file.write(str(random.randint(1,100)) + "\n") #将随机生成的数,换行输入到文件中
filename = r".\data.txt"
with open(filename , "r",) as f:
data=f.read()
sum=0
count=0
for i in data:
if i=="\n":
count+=1
continue
i = int(i)#根据ASCII表进行转换(0-9之间的数)
sum+=i
print("平均分为:",sum/count)
4. 京东笔试题
1) 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip;
2)读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
import random
with open('ips.txt','w+') as f:
for i in range(1200):
f.write('172.25.254.'+str(random.randint(1,255))+'\n')
f.seek(0,0)
s = {}
for i in f.readlines():
if i in s:
s[i] += 1
else:
s[i] = 1
li = list(s.items())
sort_li = sorted(li,reverse=True,key=lambda x:x[1])[:10]
for i in sort_li:
print(i[0],end='')
5."双色球"每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1–33中选择;蓝色球号码从1–16中选择。随机生成一个投注号码。
"
import random
res=[]
for i in range(6):
res.append(random.randint(1,33))
res.append(random.randint(1,16))
print(res)
'''