Cris 的Python笔记(十三):异常和文件处理

1. Python 是如何处理异常的?

'''
    Python 如何处理异常的?
    最简单的方式如下
    try:
        代码块(将可能出错的代码放入到 try 中)
    except:
        代码块(try 出错就执行)
    else:
        代码块(try 没有出错执行)
'''
try:
    a = 1 / 0
except Exception as e:
    print("出错了!!!")
else:
    print('没有出错!')

'''
    异常传播
        函数中出现异常,如果对异常进行了处理,那么异常不会进行向上传递,否则就一直传递到调用该函数的地方,如果还是没有处理异常就一直一直往上传递,直至主模块(__main__)
'''


def function():
    print('cris')
    10 / 0


# except 后面的异常类型决定将要捕获的异常类型,并执行 except 语句块的代码
try:
    function()
except Exception as e:
    print('➗')
else:
    pass

# 最完整异常处理语法: try 语句必须,else语句可选,except 和 finally 至少有一个
try:
    1 / 0
except Exception as e:
    print('error')
else:
    pass
finally:
    print('james')


# 自定义异常以及抛出异常(raise)


class myError(Exception):
    pass


def add(a: int, b: int)->int:
    if a < 0 or b < 0:
        raise myError("参数不能为负数")
    else:
        return a + b


print(add(1, 2))    # 3
print(add(1, -1))

2. Python 中常用的文件处理语法(重点)

'''
1. 打开文件
open 函数
open(文件名,[...]): 文件名可以是相对路径,也可以是绝对路径(windows 可以使用/代替\,或者使用 \\,或者使用 r'\' 原始字符串忽略所有转义字符);../ 表示上级目录

2. 关闭文件
文件对象.close() / with open(file_name) as file_obj 语句可以自动关闭文件流

3. 文件类型:纯文本文件和二进制文件,open方法打开文件默认以文本模式打开文件
编码格式:默认 gbk,建议设置为 utf-8(encoding='utf - 8')

4. 操作文件
文件对象.read():读取文本所有内容为字符串,对于大文件不要使用这个方法
文件对象.readLine():单行读取文本内容
文件对象.readlines():一次性将读取到的文本封装为一个列表返回,每个元素就是读取到的每行文本数据

5. 文件的迭代读取:
    while 循环
    for line in file_obj

6. 向文件写入内容
文件对象.write(字符串)
'''

# file_name = "demo.txt"
# file_obj = open(file_name)
# print(file_obj)   # <_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>

# content = file_obj.read()
# file_obj.close()
# print(content)

# 可以自动关闭文件以及捕获异常
'''
try:
    with open(file_name, encoding='utf - 8') as file_obj:
        # size 参数可以用来指定读取的字符数量(默认读取模式下 't'),默认是-1,如果读取到文本末尾,返回空字符串
        content = file_obj.read(3)
        print(content)
        # 还可以使用 len 函数计算读取的文本内容的字符数(包括换行符)
        print(len(content))
except Exception as e:
    raise e
'''

'''
try:
    with open(file_name, encoding='utf - 8') as file_obj:
        # while True:
        #     content = file_obj.readlines()
        #     if not content:  # 空字符串可以视为False
        #         print('读取完毕')
        #         break
        #     print(content)

        for x in file_obj:
            print(x)

except Exception as e:
    raise e
'''

# 使用 open 方法的时候最好指定文件操作权限,否则无法对文件进行写操作
# 在执行写操作的时候,如果文件名不存在,将会自动创建该文件
# r 表示只读,w 表示可写并覆盖以前的内容,a 表示追加内容(文件不存在,也会创建文件)
# + 表示为操作符增加功能:r+ 表示可读写(文件不存在则报错),w+ 表示可独写(文件不存在则报错),a+ 表示可读追加(文件不存在则报错)
# x 用来新建文件,文件存在则报错,不存在就创建,有写的权限但是没有读权限
file_name = 'test.txt'
with open(file_name, 'w', encoding='utf-8') as file_obj:
    result = file_obj.write('hello,cris\n')
    # 表示总共写入的字符的个数(包括换行符)
    print(result)
    file_obj.write('good morning!\n')

file_name = 'test1.txt'
with open(file_name, 'a', encoding='utf-8') as file_obj:
    file_obj.write('hehe,simida')

file_name = 'test2.txt'
with open(file_name, 'x', encoding='utf-8') as file_obj:
    file_obj.write("hehe")
    # content = file_obj.readline();
    # print(content)

3. Python 处理二进制文件

file_name = 'c:/users/zc-cris/Desktop/LinuxProbe.pdf'

'''
    读取文件的时候,有两种模式:
    1. 't' 表示读取文本文件(默认),'r' 其实默认就是 'rt'
    2. 'b' 表示读取二进制文件
    3. 读取文件千万不要一次性读取,性能非常差
    Python 中的文件对象不用自己关闭流
'''
with open(file_name, 'rb') as file_obj:
    # 读取文本文件时,size 参数默认字符
    # 读取二进制文件时,size 参数默认字节
    # content = file_obj.read(100)
    # print(content)
    new_file_name = 'LinuxProbe.PDF'
    with open(new_file_name, 'wb') as new_file_obj:
        # 定义每次读取的容量(单位字节)
        buf = 1024 * 100
        while True:
            content = file_obj.read(buf)
            if content:
                new_file_obj.write(content)
            else:
                break

4. seek 和 tell 方法

# 文本文件中,如果以二进制模式读取(read方法),一个英文字母以一个字节存储,一个中文一般在 utf-8 编码格式下是以三个字节存储,size 参数的单位就是字节
# 如果以文本模式读取(read方法),那么 size 参数的单位就是字符

'''
    tell方法可以用于查看当前读取的位置/文件指针的位置

    seek方法可以用来修改当前读取的位置/文件指针的位置,参数的单位为字节,一般用来处理英文文本
    file_obj.seek(10)
    file_obj.seek(20,0)
    file_obj.seek(30,1)
    file_obj.seek(-2,2)
    第一个参数是指针移动的距离
    第二个参数表示指针的相对位置:0 表示从文件头开始计算,默认值;1 表示从上一次指针停下的位置开始计算;2 表示从文件末尾开始计算,此时第一个参数一般都是负数,表示从后往前读取的距离
'''
with open('test.txt', 'rb') as file_obj:
    content = file_obj.read(3)
    print('当前读取到了---》', file_obj.tell())  # 3
    file_obj.seek(34)
    print('当前读取到了---》', file_obj.tell())  # 34
    print(content)  # b'\xe7\xa8\x8b' (显示中文)


'''
with open('test.txt','r',encoding='utf-8') as file_obj:
    content = file_obj.read(3)
    print(content)  # 程序猿
'''

5. 文件操作之 os 包的常用 API

import os
from pprint import pprint
'''
# 1. 获取当前文件的目录结构,参数默认是'.',可以设置为 '..' 表示上一级目录
content = os.listdir()
pprint(content)  # 返回列表,每个元素就是指定目录下的文件

# 2. 获取当前所在目录
content = os.getcwd()
pprint(content)  # 'C:\\Users\\zc-cris\\Desktop\\Python学习日记\\语法学习\\五 异常和文件处理'

# 3. 切换目录,类似 cd ..
os.chdir('..')
content = os.getcwd()
pprint(content)  # 'C:\\Users\\zc-cris\\Desktop\\Python学习日记\\语法学习'

os.chdir('C:/')
content = os.getcwd()
pprint(content)  # 'C:\\'

'''
# 4. 当前文件夹下创建一个 123 的目录
# os.mkdir("123")

# 5. 删除目录
# os.removedirs('123')

# 6. 创建文件(权限一定不能设置为 r 或者 r+)
# open('cris1.txt','w')
# open('cris2.txt','x')
# open('cris3.txt','r')

# 7. 删除文件
# os.remove('cris1.txt')

# 8. 重命名文件(第一个参数为原文件路径,第二个参数为新文件路径,如果新旧文件处于同一目录则重命名,否则就是文件剪切移动)
os.rename('cris.txt', 'new_cris.txt')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值