绝对路径:从根目录开始/
相对路径:当前目录为:“C:\Windows\System32”,目录下有个文件test.txt,他的相对路径就是.\test.txt(.\表示当前所在目录)
#可只写文件名,其他默认,文件名如不在同一路径下,需写绝对路径 f1 = open('test.txt', 'r', encoding='utf-8') print(f1.read()) print(f1.read(3)) print(f1.read(3)) #最重要一定要关闭文件,不然会占用资源 f1.close()
read()函数读取过程中提示UnicodeDecodeError异常或者显示为乱码,编码格式和open()函数打开文件的编码格式不一致
f1 = open('test.txt', 'r', encoding='utf-8') print(f1.readline()) print(f1.readline(2)) f1.close()
f1 = open('test.txt', 'r', encoding='utf-8') rl1 = f1.readlines() for i in rl1: print(i) #rl2 = f1.readlines() #print(rl2) f1.close()
open()函数和read()函数读取文件,会一次性读取全部内容,只适合读取小文件,如果文件过大,会造成内存溢出
windows下创建大文件的方法:
fsutil file createNew C:\user\xx\test.txt 1024
f_w = open('writetest.txt','w') print(f_w.write('I miss you,\nbut i miss you')) f_w.close()
#writelines可以将一个文件中的内容复制到其他文件 fr = open('test.txt','r',encoding='utf-8') fr1 = fr.read() fw = open('rwtest.txt','w',encoding='utf-8') fw.writelines(fr1) fr.close() fw.close()
#tell() f1 = open('test.txt', 'r', encoding='utf-8') print(f1.read(3)) print(f1.tell()) f1.close() #seek()使用seek函数,如果不是以二进制模式打开的话,是只允许从开头位置读取文件 f1 = open('test.txt', 'rb') print(f1.read(3)) print(f1.tell()) f1.seek(5,2) print(f1.tell()) print(f1.read(6))
with open('test.txt','w',encoding='utf-8') as f: f.write('write something') f.writelines('write a dog\nwrite a cat\nwrite a bird') with open('test.txt','r') as r: r1 = r.readlines() for i in r1: print(i)
import fileinput # print(dir(fileinput)) #inplace=True:如果有改动要将改动写到原文件,backup:是指定备份文件的扩展名,inplace和openhook不能一起使用,不然会报错:valueError for line in fileinput.input(files=('test.txt', 'rwtest.txt'),inplace=True,backup='.bak'): print(line.replace('w','W')) fileinput.close() # # 使用for循环遍历 fileinput 对象 for line in fileinput.input(files=('test.txt', 'rwtest.txt')): # 输出读取到的内容 print(line,end='') # 关闭文件流 fileinput.close()
import linecache # print(dir(linecache)) print(linecache.getline('test.txt',5)) #print(linecache.getlines('test.txt'))
AssertionError assert关键字后面的条件为假时,程序停止运行且抛出的
异常
AttributeError 当访问对象属性不存在时抛出的异常
IndexError 索引超出序列范围
KeyError 字典中查找一个不存在的关键字
NameError 访问一个没有被申明的变量时引发的异常
ValueError 传入一个不被期望的值,即 传入类型不正确
TypeError 不同数据类型直接的无效操作
ZeroDivisionError 除法运算中除数为0引发的异常
ImportError 无法引入包
IOError 输入输出异常,文件操作
语法:try:
可能产生异常的代码块
except [(error1,error2) [as e]]:
处理产生异常的代码块
except [(error1,error2) [as e]]:
处理产生异常的代码块
except Exception:
处理其他异常
异常相关的关键字:
try/except–捕获异常并处理
pass–忽略异常
as–定义异常实例(except NameError as e)
else–如果try中语句没有引发异常,那就处理else中的代码块
finally–资源回收机制,无论是否出现异常都处理的代码块
raise–引发/抛出异常
try: a = 'haha' print(a[9]) except Exception as err: print('索引超出范围:{}'.format(err))
try except捕获了异常,但是不知道哪里出现了问题,是语法问题还是数据类型的问题可以用except Exception as err把错误打印出来,方便定位问题
还可以先不加异常,先执行代码块,把可能会出现的异常加到except中
try: a = int(input('请输入一个整数: ')) b = int(input('请输入一个整数: ')) c = a/b except ValueError as e: print('输入的值有误: {}'.format(e.args)) except ZeroDivisionError as e: print('输入的值有误: {}'.format(e.args)) except Exception as err: print('未知异常') else: print('运算结果为:%s' % c) finally: print('程序结束')
raise一般和条件语句一起使用。
语法:raise[exceptionName (reason)]
raise的用法有三种:
#repr()可以把raise后面的信息打印出来 try: pwd = str(input('请输入密码:')) if len(pwd) < 8: raise ValueError('密码不能小于8位') elif len(pwd) > 16: raise ValueError('密码不能超过16位') else: print('输入正确') except ValueError as e: print('请输入正确的密码位数',repr(e))
import traceback try: print(1/0) except Exception as e: print(traceback.print_exc) error = traceback.format_exc() print(error)