七、异常处理和IO操作
1.异常处理
语法:
try:可能出现异常的代码
except:出现异常后要执行的代码
else:不出现异常时执行的操作
finally:无论是否出现异常都必须执行的操作
不同的异常是由不同的原因引起的。
常见的异常:
- ImportError: 无法引入模块或包
- IndexError: 下标索引超出序列边界;
- NameError:使用一个还未赋予对象的变量;
- SyntaxError: 代码逻辑语法出错,不能执行;
- TypeError: 传入的对象类型与要求不符;
- ValueError: 传入一个不被期望的值,即使类型正确。
- KeyError: 试图访问你字典里不存在的键
- IOError:输入输出异常
- Python还有其他一些内置的异常,比如 ZeroDivisionError 和 OSError
- 第三方库也经常定义自己的异常。
没有指定任何异常的 except 语句将捕获所有错误。应该谨慎使用,因为他们可以捕捉到意想不到的错误并隐藏编程错误。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'
try:
print('try')
a = 5 / int('0')
# except: # 捕获所有异常
# except ZeroDivisionError as e: # 捕获zeroDivisionError
except (ZeroDivisionError, ValueError, Exception) as e:
print('出现异常啦', e)
else:
print('没有异常时执行')
finally:
print('finally')
# 自定义异常,继承自Exception(Exception类是所有异常类的父类)
class UsernameExistException(Exception):
pass
def fn(username):
if username == 'admin' or username == 'tom':
raise UsernameExistException('用户名已存在') # 使用raise抛出异常
else:
print('ok')
fn(input('请输入用户名:'))
2.断言
使用 assert 断言是一个非常好的
习惯,python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要 assert 断言的帮助。
assert 断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解 assert 断言语句为 raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
断言是通过使用 assert 语句来执行的。
3.文件操作
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'
'''
读写模式:
r 读模式
w 写模式
a 追加模式
r+ 读写模式
b 二进制模式
'''
# --------读取文件 open
try:
f = open('itanty.txt', encoding='utf-8',mode='r') # 打开一个文件,返回一个对象,这个对象就代表着当前打开的文件
print(f.read()) # 一次性读取所有内容
except (FileNotFoundError, UnicodeDecodeError) as e:
print('文件找不到', e)
finally:
if f:
f.close()
# f = open('itanty.txt')
# print(type(f)) # <class '_io.TextIOWrapper'>
print('*' * 80)
# try ..except..finally 简写,使用with...as语句,会自动调用close()
with open('itanty.txt', encoding='utf-8', mode='r') as f:
# print(f.read())
# print(f.read(3)) # 指定读取字符数目 读取三个字符
# print(f.read(3)) # 再读取三个字符
# print(f.readline().strip()) # 去掉换行符
# print(f.readline()) # 读取第一行
lines = f.readlines()
print(lines) # 一次性读取所有行,返回是个list
for line in lines:
print(line.strip())
# -----写文件
with open('itanty.txt', encoding='utf-8', mode='a') as f:
f.write('xxx\n')
f.write('yyy')
# ----读写二进制文件
with open('wo.png', mode='rb') as f:
# print(f.read())
with open('itany.png', mode='wb') as out:
out.write(f.read())
print('拷贝成功')
文件操作
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'
import os
import shutil
# ---操作文件和目录
print(os.path.exists('itanty.txt')) # 指定文件、路径是否存在
print(os.path.abspath('itanty.txt')) # 获取磁盘物理路径,绝对路径 java servletContext.getRealPath
print(os.path.isfile('itany.png')) # 判断是否为文件
print(os.path.isdir('itanty.txt')) # 判断是否为目录
print(os.listdir('.')) # 返回list
# 找出当前文件下所有的文件夹
dirs = [f for f in os.listdir('.') if os.path.isdir(f)]
print(dirs)
# 创建、删除目录
# os.mkdir('world')
if os.path.exists('world'):
os.rmdir('world')
# 重命名文件或目录
# os.rename('itanty.txt', 'aaa.txt')
# 删除文件
if os.path.exists('aaa.txt'):
os.remove('aaa.txt')
# 拷贝文件
shutil.copy('itany.png','bbb.png')
八、访问mysql
1.简介
使用pymySQL模块: pip install pymysql
2.基本操作
增删改
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'
import pymysql
# 访问数据库操作
# 1.获取连接
# 定义数据库连接信息
config = {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'root',
'database': 'python',
'charset': 'utf8'
}
conn = pymysql.connect(**config)
# print(conn)
# 获取游标,相当于java中的Statement
cursor = conn.cursor()
# 执行sql语句
sql = '''
insert into t_user(username, password, age, height)
values
(%s,%s,%s,%s)
'''
num = cursor.execute(sql, ['tom', '123',18, 188]) # 为占位符%s赋值
print(num)
# 提交事务
conn.commit()
# 关闭资源
cursor.close()
conn.close()
查询
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'
import pymysql
config = {
'host':'localhost',
'port':3306,
'user':'root',
'password':'root',
'database':'python',
'charset':'utf8'
}
conn = pymysql.connect(**config)
# print(conn)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 可以指定游标返回的类型
sql = '''
select id,username,password,height,age
from t_user
'''
# 插入数据要进行提交 conn.commit()
cursor.execute(sql)
# 获取查询结果
# print(cursor.fetchone()) # 每次读取一条,返回的是元组(2, 'alice', '123', 165.0, 22)
# print(cursor.fetchmany(2)) # 获取多条
# print(cursor.fetchall()) # 获取所有
# for u in cursor.fetchall():
# print(u[1],u[4])
for u in cursor.fetchall():
print(u['username'])