【Python】学习笔记(四):异常处理、字符编码、文件读写

参考教程

异常类

简介处理

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值