相对路径和绝对路径
绝对路径:从根目录开始/
相对路径:当前目录为:“C:\Windows\System32”,目录下有个文件test.txt,他的相对路径就是.\test.txt(.\表示当前所在目录)
文件操作
- 删除、修改权限:作用于文件本身,属于系统级操作
- 写入、读取:对于文件内容的操作,属于应用级操作
- 文件操作步骤:
1、打开文件open()
2、读取文件read()、readline()、readlines()/写入文件write()
3、关闭文件close(),不管读写,最后一定要关闭文件
open()函数
- 格式:f=open(‘filename.txt’,mode=‘r’,encoding=None)
打开的文件名字,以及打开方式,及设置的编码格式,不指定打开方式,默认是read模式- mode=r
以只读的方式打开文件 - mode=rb
以二进制格式、采用只读的方式打开文件,一般用于图片、音频文件 - mode=r+
属于加模式,可读可写,其中写就是追加模式 - mode=w
以只写方式打开文件,如果文件存在,会清空文件原有内容 - mode=wb
以二进制格式、只写方式打开文件,用于非文本文件,如音频文件 - mode=w+
以读写模式打开文件,打开文件时会清空文件内容,读就属于追加模式 - mode=a
属于加模式,以只写方式打开文件,文件如果不存在,则创建新文件,若文件存在则追加到文件末尾
- mode=r
- mode=ab
以二进制格式打开文件,并采用追加模式,对文件只有写权限,文件如果不存在,则创建新文件,若文件存在则追加到文件末尾 - mode=a+
以读写模式打开文件,文件如果不存在,则创建新文件,若文件存在则追加到文件末尾
read()函数
- read()
格式:file.read([size])
不加参数则读取全部内容,加size参数则按字节读取
#可只写文件名,其他默认,文件名如不在同一路径下,需写绝对路径
f1 = open('test.txt', 'r', encoding='utf-8')
print(f1.read())
print(f1.read(3))
print(f1.read(3))
#最重要一定要关闭文件,不然会占用资源
f1.close()
read()函数读取过程中提示UnicodeDecodeError异常或者显示为乱码,编码格式和open()函数打开文件的编码格式不一致
- readline()
格式:file.readline([size])
按行读取文件内容,包括换行符‘\n’,size参数是指定一行中读取的字节数
f1 = open('test.txt', 'r', encoding='utf-8')
print(f1.readline())
print(f1.readline(2))
f1.close()
- readlines()
格式:file.readlines()
读取文件中的所有行,readlines直接读取出来的是一个list常和for循环一起使用
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
write()函数
- write()函数
语法:file.write(string)
写入字符串
f_w = open('writetest.txt','w')
print(f_w.write('I miss you,\nbut i miss you'))
f_w.close()
- writelines()函数
语法:file.writelines()
可以写入字符串列表
#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()
- seek()函数
file.seek(offset,[,whence])
offset–偏移量(支持正数(向后偏移)、负数(向前偏移))
whence–文件指针位置(0-文件开始,1-当前位置,2-文件尾)
移动文件指针到指定位置 - tell()函数
判断文件当前指针位置
#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 as 读写文件
with as语句会自动分配资源和释放资源
语法:with 表达式[as target]:
代码块
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)
- fileinput模块 逐行读取多个文件
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()
- linecache()模块 读取文件指定行
import linecache
# print(dir(linecache))
print(linecache.getline('test.txt',5))
#print(linecache.getlines('test.txt'))
python常见异常类型
- 语法错误–即解析代码时发生的错误(syntaxError)
- 运行错误–即语法正确,运行时发生了错误,我们把运行时发生的错误叫异常(Exceptions)
异常类型
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的用法有三种:
- 单独一个raise,引发当前上下文中捕获的异常
- raise异常类名称,表示引发执行类型的异常
- 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))
traceback模块
- traceback模块中的traceback.print_exc()可以将异常的传播轨迹打印到控制台或指定文件
- format_exc()返回一个字符串
import traceback
try:
print(1/0)
except Exception as e:
print(traceback.print_exc)
error = traceback.format_exc()
print(error)