异常类
简介处理
try:
100/0
except:
# 异常处理方式
print('未知异常:')
详细异常
import traceback
while True:
try:
miles = input('请输入英里数:')
km = int(miles) * 1.609344
print(f'等于{km}公里')
except Exception as e:
print('异常为', e)
# print(traceback.format_exc()) # 打印详细信息
自定义异常
# [1] 定义异常
# 异常对象,代表电话号码有非法字符
class InvalidCharError(Exception):
pass
# 异常对象,代表电话号码非中国号码
class NotChinaTelError(Exception):
pass
# [2] 返回异常
def register():
tel = input('请注册您的电话号码:')
# 如果有非数字字符
if not tel.isdigit():
raise InvalidCharError()
# 如果不是以86开头,则不是中国号码
if not tel.startswith('86'):
raise NotChinaTelError()
return tel
# [3] 获取异常
while True:
try:
ret = register()
except InvalidCharError:
print('电话号码中有错误的字符')
except NotChinaTelError:
print('非中国手机号码')
字符编码
编码后就可以进行文件存储及网络传输
编码
print ('你好'.encode('utf8')) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'
# \x 说明是用16进制表示一个字节
# e4bda0 对应 你
# e5a5bd 对应 好
解码
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf8')) # 输出 '你好'
一些字符编解码技巧
unicode数字转换为字符
>>> chr(50)
'2'
>>> chr(20013)
'中'
>>> chr(0x4e2d) # 0x开头表示数字是16进制
'中'
字符转换为unicode数字
>>> ord('2')
50
>>> ord('中')
20013
xhh_str = "xhh" # "xhh" str
xhh_b = xhh_str.encode() # 默认 'utf8' b'xhh' bytes
xhh_16 = xhh_b.hex() # 16进制 '786868' str
xhh_b_src = bytes.fromhex(xhh_16) # 转为utf-8
xhh_str_src = xhh_b_src.decode() # 默认 'utf8' 解码为 str
文件IO
要写入字符串到文件中,需要先将字符串编码为字节串。
从文本文件中读取的信息都是字节串,必须先将字节串解码为字符串。
文件的打开,分为 文本模式 和 二进制模式。
open函数
open(
file,
mode='r', # r w a
buffering=-1,
encoding=None,
errors=None,
newline=None,
closefd=True,
opener=None
)
文本模式
写入
# 指定编码方式为 utf8 r w a
f = open('tmp.txt','w',encoding='utf8')
# write方法会将字符串编码为utf8字节串写入文件
f.write('xhh NP')
# 文件操作完毕后, 使用close 方法关闭该文件对象
f.close()
读取
# 因为是读取文本文件的模式, 可以无须指定 mode参数
# 因为都是 英文字符,基本上所以的编码方式都兼容ASCII,可以无须指定encoding参数
f = open('tmp.txt')
tmp = f.read(3) # read 方法读取3个字符
print(tmp) # 返回3个字符的字符串 'hel'
tmp = f.read(3) # 继续使用 read 方法读取3个字符
print(tmp) # 返回3个字符的字符串 'lo\n' 换行符也是一个字符
tmp = f.read() # 不加参数,读取剩余的所有字符
print(tmp) # 返回剩余字符的字符串 'cHl0aG9uMy52aXAgYWxsIHJpZ2h0cyByZXNlcnZlZA=='
# 文件操作完毕后, 使用close 方法关闭该文件对象
f.close()
二进制模式
写入
# mode参数指定为 wb 就是用二进制写的方式打开文件
f = open('tmp.txt','wb')
content = '白月黑羽祝大家好运连连'
# 二进制打开的文件, 写入的参数必须是bytes类型,
# 字符串对象需要调用encode进行相应的编码为bytes类型
f.write(content.encode('utf8'))
f.close()
读取
# mode参数指定为rb 就是用二进制读的方式打开文件 白月黑羽
f = open('tmp.txt','rb')
content = f.read()
f.close()
# 由于是 二进制方式打开,所以得到的content是 字节串对象 bytes
# 内容为 b'\xe7\x99\xbd\xe6\x9c\x88\xe9\xbb\x91\xe7\xbe\xbd'
print(content)
# 该对象的长度是字节串里面的字节个数,就是12,每3个字节对应一个汉字的utf8编码
print(len(content))
任何文件都可以以字节方式读取和写入
def fileCopy(srcPath,destPath):
srcF = open(srcPath,'rb')
content = srcF.read()
srcF.close()
destF = open(destPath,'wb')
destF.write(content)
destF.close()
fileCopy('1.png','1copy.png')
with语句,防止未关闭open
# open返回的对象 赋值为 变量 f
with open('tmp.txt') as f:
linelist = f.readlines()
for line in linelist:
print(line)
立即写入文件 flush
f = open('tmp.txt','w',encoding='utf8')
f.write('白月黑羽:祝大家好运气')
# 立即把内容写到文件里面
f.flush()
# 等待 30秒,再close文件
import time
time.sleep(30)
f.close()