2021-07-28

本文介绍了Python中的异常处理机制,包括try-except-finally语句,常见异常类型以及如何自定义异常。此外,还详细讲解了文件操作,如读写模式、断言以及文件读写的最佳实践。最后,介绍了如何使用pymysql模块连接MySQL数据库,执行增删改查操作。
摘要由CSDN通过智能技术生成

七、异常处理和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'])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值