一、文件操作
文件 (保存数据--永久的)
文件都有后缀,不同的后缀表示不同的存储方式
文本文件(存文字信息)
二进制文件:视频文件、音频、图片
可执行文件等
文本文件、二进制文件、json文件(重点)的操作
1.文件操作(对文件进行读写)
步骤(所有的文件操作都满足这三步):
1.打开文件
2.对文件进行读/写操作(读:获取文件内容; 写:修改文件内容)
3.关闭文件
python中的文件操作:
1.文本文件:open(文件路径,打开的模式,encoding(编码方式))
open函数有一个返回值:返回的就是被打开的文件句柄对象
文件句柄:就是文件的代言人,对文件句柄对象进行操作
文件路径:文件在电脑中对应的地址
1.直接写全路径(不推荐使用)
2.一般将文件放到工程中
a.文件和代码对应的.py文件在同一个目录下:路径直接写文件名
b.在工程文件夹下,但是不直接和代码文件在一个目录里面:./放文件的文件夹名/文件名
打开模式:
'r'-->读(以读的形式打开,只能获取内容,不能修改内容)
'w'-->文本写(以写的形式打开, 只能修改文件,不能获取文件内容)
'a'-->文本写
'br'-->二进制读
'bw'-->二进制写
'ba'-->二进制写
2文本文件
a.打开文件
f就是被打开的文件对应的文件句柄
utf-8:一种文本编码方式,是使用 1-6个字节对Unicode进行编码;
utf-8就可以编码所有国家语言对应的字符的文本
gbk:只支持中文文本编码
f = open('yy_shlie.txt', 'r', encoding='utf-8')
b.读操作
注意:对同一文件句柄对象进行操作,每读一次内容,下次在读的时候,从上次读的结束的位置往下读
read():获取文件中所有内容,并且返回
文本文件读取的结果是字符串
# result = f.read()
# print(result) # print('hahha') print('哈哈')
read(n):n-->指定读取的文本长度(-1:读取全部内容,n大于长度:读取所有内容)
result = f.read(10)
print(result) # print('hah
readline():每次读一行内容
result = f.readline()
result = f.readline()
print(result) # print('哈哈')
f.readlines():将文件中所有的内容读出来,将每一行的内容作为列表的元素返回的
result = f.readlines()
print(result)
练习:1.读取指定文件的所有内容 2.读取指定文件的所有内容(一行一行的读)
1.result = f.read(-1)
print(result)
2.while True:
result = f.readline()
if result == '':
break
# if not result:
# break
# if len(result) == 0:
# break
print(result)
二、修改读取的位置
读写文件,每次读完或者写完,下次再读写的时候,是接着上次读写的位置往下进行读写
避免这个问题的方法:1.重新打开文件,然后再读;2.设置读写位置
f = open('yy_shlie.txt', 'r', encoding='utf-8')
读取文件中所有的内容,下次在读就是从文件结束的位置往后读
print(f.read())
seek(偏移量):是字节数(一个字母是一个字节,一个中文汉字是两个字节)
设置读写位置为文件的开始:后边进行读操作的时候,就是从文件开始的位置往后读
注意:这个 偏移量一般设置为0,其他值容易出差错
f.seek(0)
print(f.read())
三、文本文件的写操作(修改文件内容)
1.打开文件
2.写操作
3.关闭
f = open('yy_shlie.txt', 'w', encoding='utf-8')
write(写的内容):文本文件中写的内容时字符串
注意:'w'-->写的时候会覆盖原文件的内容 'a'-->在原文件的内容的后面去追加内容
f.write('添加内容')
f.seek(0) # 后面写的时候,会覆盖前面写的内容的形式去写
f.writelines(['aaa', 'bbb'])
f.close()
四、文本文件的掌握点
1.文件操作的步骤:
1.打开文件
2.操作
3.关闭
2.python中打开文件
open()函数:
open(文件路径, 打开方式, 编码方式)
文件路径:绝对地址、相对地址
打开方式:
'r'--->读(默认)
'w'--->写(1.覆盖原文件内容)
'a'--->写(在原文件内容后面追加)
文本文件的内容,对应的是字符串
读操作:注意:如果文件的路径写错了会报错:FileNotFoundError
写操作:注意:'w'、'a'打开文件,如果这个文件不存在,会创建一个新的文件
在python中国可以使用以下结构来进行文件操作过程:
with open() as 文件变量
---- 在文件打开后关闭前执行的代码段
with open('yy_shlie.txt', 'r', encoding='utf-8') as f:
print(f.read())
五、二进制文件的操作
二进制文件的读
bytes类:python中的二进制数据对应的类型是bytes-->data
二进制文件的读'br'
with open('fyh.jpg', 'br') as f:
data = f.read()
print(type(data)) # <class 'bytes'>
print(data)
二进制文件的写'bw'
with open('new.jpg', 'bw') as f:
f.write(data) # data需要是bytes类型的数据
二进制文件的写'ba'
with open('new1 .jpg', 'ba') as f:
f.write(data) # data需要是bytes类型的数据
六、json文件的读写
json文件:就是后缀是.json的文件,用来存储文本数据(以特殊的语法结构来存储文本信息)
最外层要么是字典结构,要么是列表结构
里面的数据:字符串、数字、二进制、字典、数组(列表)
格式:
{}-->字典结构
{
"name":"aa",
"age":18,
"score":[100, 90, 80]
}
[]-->数组(列表)结构
[
100,
"name"
"person":{"name":"张三"}
]
""-->字符串
"
name, abc, njxdd, dfsf
"
json文件的读写:
python中使用python内置模块json来对json数据进行操作
1.读取json文件中的内容:
json.load(f):读的结果只有两种情况,要么是字典,要么是列表
json.loads(json字符串, 编码方式)--->将字典字符串转换成字典;将列表字符串转换成列表
import json
result = json.loads('{"name": "hy", "age": 2}', encoding='utf-8')
print(result, type(result)) # {'name': 'hy', 'age': 2} <class 'dict'>
with open('iKang.json', 'r', encoding='utf-8') as f:
# print(f.read()) 这样拿出来是字符串
result = json.load(f)
print(type(result)) # <class 'dict'> 字典
print(result)
2.json文件的写操作
json.dump(写的内容, f):写的内容只能是字典或者列表
json.dumps(对象)--->将字典、列表转换成字符串,和loads相反
result = json.dumps([1, 2, 3, 4])
print(result, type(result)) # [1, 2, 3, 4] <class 'str'>
with open('myjson.json', 'w', encoding='utf-8') as f:
dic1 = {'aaa': 100, 'score': 99, 'person': {'name': 'yy', 'age': 23}} # 字典
json.dump(dic1, f)
with open('myjson1.json', 'w', encoding='utf-8') as f:
list1 = [10, 20, 'a', 'abc'] # 列表
json.dump(list1, f)
with open('myjson2.json', 'w', encoding='utf-8') as f:
tuple1 = [10, 26, 'a', 'abc', 920, 'fg'] # 元祖
json.dump(tuple1, f)
七、学生信息持久化练习
写一个添加学生的功能,将添加的学生信息持久化
1.添加学生
2.查看学生
import json
key_name = 'name'
key_age = 'age'
key_tel = 'tel'
try:
with open('yy_xsxx.json', 'r', encoding='utf-8') as f:
all_students = json.load(f)
except:
all_students = {}
输入学生信息
stu_name = input('请输入学生姓名:')
stu_age = input('请输入学生年龄:')
stu_tel = input('请输入学生电话:')
一个学生对应一个字典,多个学生用一个字典存起来
stu_dict = {
key_name: stu_name,
key_age: stu_age,
key_tel: stu_tel
}
保存学生信息
all_students[stu_name] = stu_dict
保存到本地
with open('yy_xsxx.json', 'w', encoding='utf-8') as f:
json.dump(all_students, f)
print(all_students)
八、异常捕获
在之前的学习中,由于各种原因,我们的代码会出现各种各样的错误,这些错误叫异常
如果程序出现异常,程序会崩溃,不能继续执行。
但是有的时候出现异常,我们可能希望由自己解决出现异常的问题,不希望程序崩溃,就可以去捕获异常
捕获异常:
格式1:
try:
代码块1(需要捕获异常的代码块)
except:
代码块2(出现异常后执行的)
执行过程:先执行代码块1,如果代码块1出现异常,就执行代码块2;
# 如果代码块1不出现异常,就执行try结构外的其他结构
import json
try:
with open('yy_xsxx1.json', 'r', encoding='utf-8') as f:
all_students = json.load(f)
except:
print('出现异常')
格式2:
try:
代码块1
except 错误类型列表:
代码块2
#出现指定错误类型的异常,才会捕获
try:
with open('yy_xsxx2.json', 'r', encoding='utf-8') as f:
all_students = json.load(f)
except FileNotFoundError:
print('出现异常')
except ValueError:
print('值出现异常')
finally:
print('不管有没有异常都要执行')