Python学习笔记-文件与异常

一、文件读写

例:有一个位于C:\python名为alphabet.txt的文件,内容如下:

abcdefg
hijklmn
opqrst
uvwxyz

1. 读写文件

1) open

打开文件:open(文件路径,[读取方式])

关闭文件:close()

open和close要一起使用,只用open,python不会自动把打开的文件的关闭,可能会导致一些问题如数据损坏或丢失,占用资源等,但不加close()不会导致语法错误

操作文件:读取read()、redlines(),写入write()

filepath='C:/python/alphabet.txt'   #将文件路径存储在变量中,方便使用
file1=open(filepath,'r')    #打开文件
print(file1.read())     #读取文件并打印

'''
abcdefg
hijklmn
opqrst
uvwxyz
'''
file1.close()           #关闭文件
文件路径
相对路径:相对于当前目录下的文件路径

假设上例代码中,alphabet.txt在所执行的py文件的目录下,那么第一行可以改成,执行结果一致:

filepath='alphabet.txt'
绝对路径:从文件系统的根目录开始的完整路径

..表示上一级目录,.表示当前目录

如果alphabet.txt在所执行的py文件的目录下,那么第一行可以改成,执行结果一致:

filepath='./alphabet.txt'

如果alphabet.txt在所执行的py文件的上一级目录下,那么第一行可以改成,执行结果一致:

filepath='../alphabet.txt'
读取方式
r:只读,如果文件不存在,则报错
w:只写,清空写入,配合使用write()向文件内写入内容,即如果该文件里本来有内容,会将原来的内容清空,将新的内容写入,如果文件不存在,则自动创建该文件
filepath='alphabet.txt'
file1=open(filepath,'w')
file1.write('ABCDEFG')
file1=open(filepath,'r')  #因为上面的w是只写,所以要读取文件内容,还得重新open一次
print(file1.read())      #ABCDEFG
file1.close()
a:只写,追加写入,配合使用write()向文件内写入内容,即如果该文件里本来有内容,不会将原来的内容清空,将新的内容写入到原有内容的后面,如果文件不存在,则自动创建该文件
filepath='alphabet.txt'
file1=open(filepath,'a')
file1.write('\nABCDEFG')    #\n换行符
file1=open(filepath,'r')
print(file1.read())     
file1.close()
'''
abcdefg
hijklmn
opqrst
uvwxyz
ABCDEFG
'''

从上述看,只读或者只写比较麻烦,那么是否可以同时读写,答案是可以的,只要在上述三种方式后面加“+”

r+:写入是覆盖写入,即如果该文件里本来有内容,不会将原来的内容清空,将旧的内容从开始进行覆盖,如果文件不存在,则报错
filepath='alphabet.txt'
file1=open(filepath,'r+')
file1.write('ABCDEFG\n')
file1.seek(0)    #将光标移到文件首位,否则光标在刚刚写入完成的下一行首位,不会打印出刚刚写入的内容
print(file1.read())     #不需要再打开文件,直接读取    
file1.close()
'''
ABCDEFG
hijklmn
opqrst
uvwxyz
'''
filepath='aaaa.txt'    #目录下没有aaaa.txt文件
file1=open(filepath,'r+')      #FileNotFoundError: [Errno 2] No such file or directory: 'aaaa.txt'
w+:写入是清空写入,如果文件不存在,则自动创建该文件
filepath='alphabet.txt'
file1=open(filepath,'r+')
file1.write('ABCDEFG\n')
file1.seek(0)    #将光标移到文件首位,否则光标在刚刚写入完成的下一行首位,不会打印出刚刚写入的内容
print(file1.read())     #不需要再打开文件,直接读取    
file1.close()
'''
ABCDEFG
'''
a+:写入是追加写入,如果文件不存在,则自动创建该文件
filepath='alphabet.txt'
file1=open(filepath,'a+')
file1.write('ABCDEFG\n')
file1.seek(0)    #将光标移到文件首位,否则光标在刚刚写入完成的下一行首位,不会打印出刚刚写入的内容
print(file1.read())     #不需要再打开文件,直接读取    
file1.close()
'''
abcdefg
hijklmn
opqrst
uvwxyz
ABCDEFG
'''
文件操作
读取文件

read():读取文件内的全部内容,返回一个字符串

readline(), readlines():按行读取文件内容,readline读取一行;readlines读取全部行,以列表返回,这个就可以通过访问列表来读取文件内容的中间部分

filepath='alphabet.txt'
file1=open(filepath)   
print(file1.readline())  #ABCDEFG
file1.seek(0)
print(file1.readlines())    #['ABCDEFG\n', 'hijklmn\n', 'opqrst\n', 'uvwxyz']
for i in range(1,3):  
    print(list1[i],end='') #打印中间第2行和第3行,end=''表示打印完不另外多换一行
'''
hijklmn
opqrst
'''
file1.close()

 2)with open

with open(文件路径, [读取方式]) as 文件别名:

这个方法不需要close(),其他操作跟open类似

with open('alphabet.txt') as file1:    
    print(file1.read())
'''
abcdefg
hijklmn
opqrst
uvwxyz
'''

可以同时打开多个文件:

例:alphabet.txt和alphabet1.txt位于同一目录,且内容相同

with open('alphabet.txt') as file1,open('alphabet1.txt') as file2:
    print(file1.read())
    print(file2.read())
'''
abcdefg
hijklmn
opqrst
uvwxyz
abcdefg
hijklmn
opqrst
uvwxyz
'''

二、异常

程序执行期间发生的错误称为异常,如果有处理异常的代码,程序将继续运行,如果没有,程序将终止,并显示一个traceback,其中包含有关异常的报告

常见异常举例

1. ZeroDivisionError

0作为除数的异常,不能将一个数字除以0

2. FileNotFoundError

文件未找到异常,可能是文件不存在或者路径不正确

 3. NameError

变量未定义异常

4. IndexError

下标越界异常,在使用有下标属性的对象时下标超过对象的实际长度,下标从0开始

5. ValueError

数值异常,如类型转换时,填入的内容无法正确转换;使用函数时,参数超出了范围等

6. TypeError

类型错误,执行与对象类型不兼容的操作时会出现

  Python中所有异常都继承自BaseException

print(ZeroDivisionError.__bases__)     #(<class 'ArithmeticError'>,)
print(ArithmeticError.__bases__)       #(<class 'Exception'>,)
print(Exception.__bases__)             #(<class 'BaseException'>,)
print(BaseException.__bases__)         #(<class 'object'>,)

处理异常

使用try-except代码块处理异常,出现异常时,程序继续运行,但会显示程序员自己编写的错误信息

try:

        可能出现异常的代码块

except [异常名]:

        捕获异常之后的处理代码块

try:
    1/0
except ZeroDivisionError:
    print('0不能做除数')      #0不能做除数

 except语句

至少有一个except,也可以有多个except

try:
    input1=int(input('请输入一个数字:'))
    res=10/input1
    print(res)
except ZeroDivisionError:
    print('0不能做除数')
except ValueError:
    print('输入的不是数字')
'''
请输入一个数字:0
0不能做除数
'''
'''
请输入一个数字:a
输入的不是数字
'''

也可以将捕获到的异常描述放到一个对象中,使用as关键字

except 异常名 as 变量名:

try:
    1/0
except ZeroDivisionError as e:   
    print('0不能做除数: ',e)        #0不能做除数:  division by zero  e的内容就是traceback里异常的描述

 except后面可以什么都不跟,表示捕获所有异常,也可以跟异常的大类如Exception

try:
    1/0
    print(res)
except:
    print('程序出现异常')        #程序出现异常

  else语句

可以没有else语句,当程序执行完毕,没有出现异常,那么执行一次else语句

try:
    input1=int(input('请输入一个数字:'))
    res=10/input1
    print(res)
except ZeroDivisionError:
    print('0不能做除数')
except ValueError:
    print('输入的不是数字')
else:
    print('程序成功执行完成')
'''
请输入一个数字:0
0不能做除数
'''
'''
请输入一个数字:2
5.0
程序成功执行完成
'''

finally语句

可以不加finally语句,程序执行完成,无论有没有发生异常都会执行一次finally语句

try:
    input1=int(input('请输入一个数字:'))
    res=10/input1
    print(res)
except ZeroDivisionError:
    print('0不能做除数')
except ValueError:
    print('输入的不是数字')
finally:
    print('程序执行完成')
'''
请输入一个数字:0
0不能做除数
程序执行完成
'''
'''
请输入一个数字:2
5.0
程序执行完成
'''

语法错误不能被try-except处理

try:
    print()
except SyntaxError:
    print('语法错误')  
'''
    print()
         ^
SyntaxError: invalid character '(' (U+FF08)
'''

手动抛出异常

使用raise关键字

1. 抛出python本身内置的异常

try:
    raise ZeroDivisionError('除0异常')
except ZeroDivisionError:
    print('0不能做除数')     #0不能做除数

2. 抛出自定义异常

class MyException(Exception):
    def __init__(self, hint):
        self.hint = hint
 
def func1(x,y):
    if y==0:
        raise MyException("0不能做除数")
    else:
        return x/y
try:
    func1(1,0)
except MyException as e:
    print("捕获到自定义异常:", e.hint)

'''
捕获到自定义异常: 0不能做除数
'''

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值