13.01_Python语言基础(文件概述)(熟练)
13.02_Python语言基础(文件打开关闭)(掌握)
13.03_Python语言基础(文件的读写)(掌握)
13.04_Python语言基础(制作文件的备份)(掌握)
13.05_Python语言基础(文件的定位读写)(掌握)
13.06_Python语言基础(文件的操作)(掌握)
13.07_Python语言基础(StringIO和BytesIO)(熟练)
13.08_Python语言基础(异常概述)(掌握)
13.09_Python语言基础(异常的处理)(掌握)
13.10_Python语言基础(捕获多个异常)(掌握)
13.11_Python语言基础(else)(掌握)
13.12_Python语言基础(try...finally)(掌握)
13.13_Python语言基础(异常的传递)(掌握)
我们日常中操作文件的过程:
打开一个文件 ,或者新建一个文件
读写数据
关闭文件
在python中,使用open()函数可以打开一个已经存在的文件,或者创建一个新的文件
格式:
open(文件名,访问模式)
f = open("test.txt","w")
访问模式 说明
w 打开一个文件只用于写入,如果该文件已经存在则将其覆盖,如果不存在,创建新文件
r 以只读的方式打开一个文件,文件的指针将会在文件的开头位置,默认模式,如果文件不存在会报错
a 打开一个文件用于追加,如果该文件已经存在,文件的指针会放在文件的结尾,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入
rb 以二进制的方式打开一个文件用于只读,文件的指针将会在文件的开头位置,默认模式,如果文件不存在会报错
wb 以二进制的格式打开一个文件只用于写入,如果该文件已经存在则将其覆盖,如果不存在,创建新文件
ab 以二进制方式打开一个文件用于追加,如果该文件已经存在,文件的指针会放在文件的结尾,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入
r+ 打开一个文件用于读写,文件的指针放在文件的开头位置
w+ 打开一个文件用于读写,如果该文件已经存在将其覆盖,如果文件不存在,创建一个新文件
a+ 打开一个文件用于读写,文件的指针放在文件的末尾位置,,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入
rb+ 以二进制的方式打开一个文件用于读写,文件的指针放在文件的开头位置
wb+ 以二进制的方式打开一个文件用于读写,如果该文件已经存在将其覆盖,如果文件不存在,创建一个新文件
ab+ 以二进制的方式打开一个文件用于读写,文件的指针放在文件的末尾位置,,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入
使用函数:
close()
f = open("test.txt","w")
f.close()
"""
注意:
close()作用—》释放内存
使用write()函数可以完成对文件写入内容
格式:
f.write(str)
f = open("test.txt","w")
f.write("hello world !")
f.close()
注意:
如果文件不存在则创建,如果存在,则先清空,在写入数据
1.读取数据使用read()函数,可以从文件中读取数据,
格式:
read(num)
num : 表示要从文件中读取的数据的长度(单位字节),
如果num没有传入,那么表示读取文件的所有数据
"""
# f = open("test.txt")
# content = f.read()
# print(content)
# content1 = f.read(5)
# print(content1)
# f.close()
注意:
如果使用了多次,那么后面读取的数据是从
上一次读取完数据后的位置开始
f = open("test.txt", "r+")
f.write("hello python \n hello python \n hello python \nhello python ")
content = f.readlines()
print(type(content))
print(content)
# 获取列表中所有的内容
i = 1
for temp in content:
print("%d:%s" % (i, temp))
i += 1
f.close()
运行输出结果:
['hello python \n', ' hello python \n', ' hello python \n', 'hello python ']
1:hello python
2: hello python
3: hello python
4:hello python
readline:返回的数据是str
f = open("test.txt","r")
content = f.readline()
print(type(content))
content2 = f.readline()
content3 = f.readline()
print(content)
print(content2)
print(content3)
f.close()
运行输出结果:
******************************
hello python
hello python
hello python
思考:有一个很大的文件5G,思想怎样读取里面的数据(readline/read(num))
# Comma-Separated Values,CSV,有时也称为字符分隔值
# 导入CSV模块 pdf 图片
import csv
def readCsv(path):
infoList = []
with open(path,"r") as f:
allFileInfo = csv.reader(f)
# print(type(allFileInfo))
for row in allFileInfo:
infoList.append(row)
return infoList
path = r"文件路径"
info = readCsv(path)
print(info)
import csv
def writeCsv(path,data):
with open(path,"w") as f:
writer = csv.writer(f)
for rowDate in data:
writer.writerow(rowDate)
path = r"文件路径"
writeCsv(path,[["1","2","3"],["4","5","6"],["7","8","9"]])
分析:
input()-->string
open()
判断用户输入的文件是否存在
存在
1.打开文件
2.读取数据
3.关闭文件
不存在----》错误提示
完成备份:
1.拿到刚才读取到的数据
2.创建一个新文件,将刚才读取到的数据写到这个新文件中
3.关闭文件
oldFileName = input("请输入需要备份的文件:")
#打开需要备份的文件
oldFile = open(oldFileName,"r")
#读取需要备份文件的内容
#判断是否打开
if oldFile:
#提取文件的后缀名
fileFlagNum = oldFileName.rfind(".")
if fileFlagNum > 0:
fileFlag = oldFileName[fileFlagNum]
#组织新文件的名字
newFilename = oldFileName[:fileFlagNum]+"[复件]"+fileFlag
#创建一个新的文件
newFile = open(newFilename,"w")
#将旧文件中的数据,一行一行的方式进行复制到新文件中
for lineContent in oldFile.readlines():
newFile.write(lineContent)
#关闭文件
oldFile.close()
newFile.close()
"""
获取当前读写文件的位置
在读取文件的过程中,如果想知道当前的位置,
可以使用函数tell()来获取,是光标开始的位置
"""
# 打开一个文件
f = open("test.txt", "r")
str = f.read(3)
print(str)
# 查找当前光标的位置
position = f.tell()
print(position)
str = f.read(3)
position = f.tell()
print(position)
f.close()
如果在读写文件的过程中,需要从另外一个位置进行操作,可以使用seek()函数
格式:
seek(offset,from)
offset:偏移量
from:方向
0:表示文件的开头
1:表示当前位置
2:表示文件的末尾
案例L:
把位置设置为:从文件的开头,偏移5个字节
"""
#打开一个文件
f = open("test.txt","rb+")
str = f.read(30)
print(str)
#查找光标当前的位置
# position = f.tell()
# print(position)
#重新设置位置
f.seek(-3,2)
position = f.tell()
print(position)
f.close()
注意:
如果打开文件的模式"r",而不是"rb",则会报错
在文本文件中,没有使用b模式选项打开文件,只允许从文件的开头计算相对位置
格式和案例:
rename(需要修改的文件名,,新的文件名)
import os
# os.rename("test.txt","毕业论文.txt")
概述:
os模块中remove()可以完成对文件的删除操作
格式:
remove(待删除的文件名)
案例:
os.remove("毕业论文.txt")
概述:
使用os模块中mkdir()函数
格式:
mkdir(str)
案例:
import os
os.mkdir("张三")
概述:
使用os模块中listdir()函数
格式:
listdir()
案例:
import os
print(os.listdir("./"))
#结果为当前目录的文件
概述:
使用os模块中的rmdir()函数
格式:
rmdir(str)
str--->表示需要删除的文件夹名称
案例:
import os
os.rmdir("张三")
"""
StringIO
"""
from io import StringIO
f = StringIO()
f1 = f.write("hello")#返回的是写入数据的字节数(每次写入的数据)
print(type(f1))
print(f1)#5
f2 = f.write(" ")
print(f2)#1
f3 = f.write("world!")
print(f3)#6
print(f)
print(f.getvalue())
"""
读取StringIO文件,可以用一个str初始化StringIO,
"""
f = StringIO("hello\nhi\ngoodbye!")
while True:
s = f.readline()
if s == "":
break
print(s.strip())
StringIO操作---》str
如果操作二进制数据,需要使用BytesIO
BytesIO实现在内存中读取byte数据
print("------test-----1")
open("123.txt","r")
print("-----test------2")
当python检测到一个错误时,解释器就无法继续执行,反而出现错误提示—>异常
import os
print("核心代码")
try:
os.rename("file", "file00")
# print("lalala")
print("hello"[10])
except (Exception, IndexError) as e:
print(e)
else:
print("没有报错")
finally:
print("关闭电源,放掉那个人")
print("比核心代码还重要的代码")
总结:
把可能出现问题的代码,放在try里面,
把异常处理的代码放在except中
try:
print("------test-----1")
open("123.txt","r")
except (IOError,NameError):
print("找不到该文件")
print("-----test------2")
print("-----test 3")
"""
报错,异常处理的类型不正确
"""
try:
open("123.txt","r")
print("hello[10]")
except (FileNotFoundError, IndexError) as e:
# print("文件不存在....")
print(e)
关键字as e后面跟的是错误的描述信息errorMsg
那么它的基本格式:
except (错误类型) as 变量名:
return 变量名
如果同时存在多个异常,把异常写成元组放在except后面
# exception
try:
# open("133.txt","r")
# print(AA.aa())
print(abcd)
open("134.txt", "r")
print(AB.aa())
print(abcdaaa)
except Exception as reslut:
print(reslut)
try:
num = 300
print(num)
except NameError as errormsg:
print(errormsg)
else:
print("没有捕获到异常,真高兴!")
import os
def demo13():
try:
os.remove("file")
except Exception as e:
print(e)
def get_result(*args):
result = 0
for i in args:
result += i
return result
while True:
select = int(input("请输入您的选择"))
if select == 1:
# 可以再此处处理异常,也可以在被调用的函数中处理异常
# try:
# demo13()
# except Exception as e:
# print(e)
demo13()
elif select == 2:
print(get_result(1, 2, 3, 4, 5))
elif select == 3:
break
else:
print("输入有误")
print("代码开始运行")
try:
print("异常处理的第一层")
try:
print(1 / (int(input("请输入一个整数:"))))
try:
print(input("请输入一个很长的字符串")[10])
except Exception as e:
print(e)
try:
print("我是很长字符串下面那句")
except Exception as e:
print(e)
except Exception as e:
print(e)
except Exception as e:
print(e)
print("代码运行结束")
#自定义的异常类,判断密码长度,如果长度小于6就报错
class ShortInputException(Exception):
def __init__(self, length):
self.length = length
self.atLeast = 6
def __str__(self):
return "ShortInputException: 最小长度要求是6,,您输入的是%d" % self.length
try:
password = input("请输入密码:")
if len(password) < 6:
# raise 抛出异常
raise ShortInputException(len(password))
except ShortInputException as e:
print(e)
else:
print("密码长度合法")