Python基础-异常-文件操作open()

异常简介

产考文档:https://docs.python.org/3/library/exceptions.html
产考文档-传送门

  1. 程序在运行过程当中,不可避免的会出现一些错误,比如:
  • 使用了没有赋值过的变量
  • 使用了不存在的索引
  • … 这些错误在程序中,我们称其为异常。
  1. 程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行!

处理异常

  1. Python是希望在出现异常时,我们可以编写代码来对异常进行处理!不是让我们的程序直接终止!
try:
	代码块(可能出现错误的语句)
except: # except子句可以写多个或一个
	代码块(出现错误以后的处理方式)
except:
	代码块(出现错误以后的处理方式)
except:
	代码块(出现错误以后的处理方式)
else:
	代码块(没出错时要执行的语句)
finally:
    代码块(该代码都会执行)
    
#try是必须要有的,else是可以没有的(finally)
#except和finally 至少有一个
'''
可以将可能出错的代码放入到ty语句,这样如果代码没有错误,则会正常执行如果出现错误,则会执行except子句中的代码,这样我们就可以通过代码来处理异常。避免因为一个异常导致整个程序的终止
'''

异常传播(抛出异常)

  1. 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播

  2. 如果函数中没有对异常进行处理,则异常会继续向函数调用处传播,函数调用处没有处理则继续向被调用的地方传播。

  3. 直到传播到全局作用域 (主模块),依然没有处理则程序终止,并且显示异常信息

  4. 当程序运行过程中出现异常以后,所有的异常信息会被保存一个专门的异常对象中。而异常传播时,实际上就是异常对象抛给了调用处

    • 比如:

    • ZeroDivisionError类的对象专门用来表示除0的异常

    • 常见的异常

      • IndexError

        索引值超过了列表长度

        >>> l = [1]
        >>> l[2]
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        IndexError: list index out of range
        
        
      • KeyError

        找不到Key

        >>> d = {"a": 1}
        >>> d["b"]
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        KeyError: 'b'
        
      • ValueError

        传入的参数错误

        >>> int('a1')
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        ValueError: invalid literal for int() with base 10: 'a1'
        
        
      • TypeError

        类型错误, 常见于运算

        >>> 1 + '2'
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        TypeError: unsupported operand type(s) for +: 'int' and 'str'
        
        
      • SyntaxError

        语法报错, 检查自己的语法有没有写错

      • IndentationError

        缩进错误

        • 混用tab和space(空格)
        • 缩进长度不对
自定义异常
#创建一个继承Exception的类,就可以自定义异常
class MyError(Exception):
    pass

def add(a,b):
    #如果a,b中有负数,就向调用出抛出异常
    if a < 0 or b < 0 :
        raise Exception('参数中不能有负数')
        raise MemoryError('自定义的异常')
        #也可以用if else 代替
print(add(-1,15))

文件(File)

参考文档:https://docs.python.org/3/library/functions.html
产考文档-传送门

  1. 通过Python程序来对计算机中的各种文件进行增删改查的操作

  2. I/O(Input Output)

  3. 操作文件的步骤

    • 打开文件

    • 对文件进行各种操作(读,写),然后保存

    • 关闭文件

open

  1. 写:open()+write()

    #在windows系统使用路径时,可以使用/来代替\
    #或者可以使用\\来代替、
    #或者也可以使用原始字符串
    #file_name = 'E:/20220708_file_python/demo01.txt'
    file_name =  r'E:\20220708_file_python\demo02w.txt' 
    #使用open() 打开文件时必须要指定打开文件所要做的操作(读、写、追加)
    #如果不指定操作类型,则默认是 (r)读取文件,而读取文件时是不能向文件中写入的
    #r 表示只读的
    #w 表示是可写的,使用来写入文件时,如果文件不存在会创建文件,如果文件存在则会覆盖文件
    #a表示追加内容,如果文件不存在会创建文件,如果文件存在则会向文件中追加内容
    #+ 为操作符增加功能
    #a+即可读又可写,文件不存在会报错
    #with open(file_name, 'w', encoding='utf-8') as file_obj:
    with open(file_name, 'r+', encoding='utf-8') as file_obj:
        #write()  来向文件中写入内容
        #如果操作的是一个文本文件的话,则write() 需要传递一个字符串作为参数
        #该方法会可以分多次向文件中写入内容
        #写入完成以后,该方法会返回写入的字符的个数
        file_obj.write('1.二哈哒哒哒哒哒\n')
        file_obj.write(str(2.1234564050)+'11111\n')
        file_obj.write('3..dudududududu\n')
       
      
        
    
  2. 读:read()

    '''
    open(file, mode='r', buffering=- 1, encoding=None, errors=None, 
    newline=None, closefd=True, opener=None)¶
    使用open函数来打开一个文件
    参数:
    fi1e要打开的文件的名字(路径)
    返回值:
    返回一个对象,这个对象就代表了当前打开的文件
    '''
    
    file_name = r'E:\20220708_file_python\demo01.txt'  #原始字符串
    
    '''
    print(file_obj)
    #调用open()打开文件
    file_obj = open(file_name)
    #当我们获取到文件对象以后,所有的对文件的操作都应该通过 对对象来进行
    #读取文件内容
    
    #read()方法,用来读取文件中的内容,它会将内容全部保存为一个字符串返回
    content = file_obj.read()
    print(content)
    
    #关闭文件
    #调用close() 方法来关闭文件
    #file_obj.close()
    '''
    
    # with ... as 语句
    try:
        with open(file_name) as file_obj:
        #在with语句中可以直接使用file_obj来做文件操作
        #此时这个文件只能在with中使用,一旦with结束则文会自动close()
            print(file_obj.read())
    except FileNotFoundError:
        print(f'{file_name}文件不存在')
    
    
  3. try + with open() + while


file_name = r'E:\20220708_file_python\demo01.txt' 

try:
    with open(file_name, encoding='utf-8') as file_obj:
        #定义一个变量,来保存文件内容
        file_txt = ''
        #定义一个变量,指定每次读取文件的大小
        key = 5
        #创建一个循环,来读取文件内容
        while True:
            #读取 `key` 大小的内容 
            txt = file_obj.read(key)

            # 检查是否 读取到内容
            if not txt:
                #内容读取完毕,就退出循环
                break
            #输出内容 1
            #print(txt,end='')
            #输出内容 2
            file_txt += txt
except FileNotFoundError as e:
    print(e)

print(file_txt)
  1. readline()+readlines()
import pprint
file_name = r'E:\20220708_file_python\demo01.txt' 

with open(file_name, encoding='utf-8') as file_obj:
    #readline()
    #该方法可以用来读取一行内容
    #print(file_obj.readline(),end='')
    #print(file_obj.readline())
    #print(file_obj.readline())

    #readlines()
    #该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表中返回
    #r=file_obj.readlines()
    #pprint.pprint(r[0])
    #pprint.pprint(r[1])

    for i in file_obj:
        print(i)
  1. 二进制文件
#t读取文本文件(默认值)
#b读取二进制文件
file_name = r'F:\.md-demo\11111.png'

with open(file_name, 'rb') as file_obj:
    #读取文本文件时,size是以字符为单位的
    #读取二进制文件时,size是以字节为单位
    #
    # print(file_obj.read(100))
    #new_name  定义一个新的文件
    new_name = r'E:\ile_python\new02.png'
    with open(new_name, 'wb') as new_obj:
        #定义每次读取的大小
        chunk = 1024 *100

        while True:
            #从已有的对象中读取数据
            content = file_obj.read(chunk)
            
            #内容读取完毕终止  `while` 循环
            if not content:
                break
            new_obj.write(content)
  1. seek() + tell()
file_name =  r'E:\demo02w.txt' 
'''
with open(file_name, 'rb') as file_obj:
    
    #seek()  可以修改当前读取位置
    file_obj.seek(10)
    file_obj.seek(12 , 1)
    #print(file_obj.read(122))
    #seek(a,b)  需要两个参数
    #a代表:要切换到的位置
    #b代表:计算位置方式
    #可选值:
    #0,从头计算,默认值
    #1,从当前位置计算
    #2,从最后位置开始计算

    #tell()  可以查看当前读取位置
    print('当前读取到了-->', file_obj.tell())
'''
with open(file_name, 'r', encoding='utf-8') as file_obj:
    
    #seek()  可以修改当前读取位置
    file_obj.seek(6)
    print(file_obj.read()) #跳过前6个字节

    #tell()  可以查看当前读取位置
    print('当前读取到了-->', file_obj.tell())
  1. Os
import os
import pprint
#
# Os产考文档:https://docs.python.org/3/py-modindex.html#cap-o
#os.listdir()  获取指定目录的目录结构
#需要一个路径作为参数,会获取到该路径下的目录结构,默认路径为,当前目录
#该方法会返回一个列表,目录中的每一个文件(夹)的名字都是列表中的一个元素
#r = os.listdir('..')

#getcwd() 获取当前目录
r = os.getcwd()
pprint.pprint(r)
#os.chdir()  换当前所在的目录作用相当于cd
#os.chdir('c:/')

#创建目录
#os.mkdir("aaa")  #在当前目录下创建一个名字为aaa的目录
#创建文件  #open('aa.txt','w')
open(r'E:\\11.txt','w')
#删除目录  #os.rmdir('aaa')
#删除文件  #os.remove('aa.txt')
#修改文件
#os.rename('旧名字','新名字')
#os.rename('aa.txt','bb.txt')


Python基础-函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值