一、文件读写
例:有一个位于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不能做除数
'''