python-文件操作
学习目标
-
掌握使用 read,write 读写文本文件;
-
掌握读取 json 文件内容;
第 1 章 文件操作------基本操作
一、⽂件操作流程
1. 操作⽂件的套路
- 打开⽂件---open函数
- 读、写⽂件
- 读: 将⽂件内容读⼊内存----read
- 写: 将内容写⼊⽂件---write
- 关闭⽂件---close
2. 操作⽂件的函数/⽅法
在 Python 中要操作⽂件需要记住 1 个函数和 3 个方法
3. 读取第一个文件内容案例
打开文件:
-
file=open(r"要打开文件的路径和文件名","r")
-
file是一个变量名,代表文件操作对象
-
避免文件路径转义,加上"r" 第二个r表示只读方式打开文件
读取文件内容:
- txt=file.read()
- txt是定义一个变量,代表存放读取到的文件内容
- file是上一个open返回的文件操作对象
- read()是file对象的一个方法,用来读取文件内容
关闭文件:
- file.close()
- file是上一个open返回的文件操作对象
- 文件打开后,一定要关闭文件
- close()是file对象的一个方法,用来关闭文件内容
#打开文件
file=open(r"./data.csv","r") #第一个r是防止转义,第二个r表示只读属性
#读取文件
txt=file.read()
print(txt)
#关闭文件
file.close()
hello,python
Process finished with exit code 0
4. 写入第一个文件案例
打开文件:
-
file=open(r"要打开文件的路径和文件名","w")
-
第二个参数w代表用写的方式打开文件
-
如果用w方式打开文件,文件名不存在,会创建一个新文件,存在的话会覆盖已有文件
-
”a“表示追加写入,”w“表示覆盖写入
写文件:
- file.write(要写入的内容)
关闭文件:
- file.close()
#打开文件
file=open(r"./data2.csv","w")
#写内容
file.write("hello python")
#关闭文件
file.close()
验证是否写入成功:
二、open 打开⽂件的⽅式
open 函数默认以只读⽅式打开⽂件,并且返回⽂件对象
“r”:只读方式打开文件; (文件必须存在)
“w”:只写方式打开文件;
“a”:追加写方式打开文件;
open 函数的访问方式后面添加 b 参数代表访问二进制文件,如:
rb : 代表用只读的方式打开一个二进制文件;
wb:代表用只写的方式打开一个二进制文件。
ab:代表用追加写的方式打开一个二进制文件
三、open 打开文件时指定字符集
open(文件名, 打开方式, encoding=’字符集’)
1. 以 utf8 编码格式打开文件
如果指定文件字符集编码不是 utf8,open打开会报错(文件中有中文,打开会报错,加上encoding="utf8")
#打开文件
file=open(r"./data.csv","r",encoding="utf8")
#读取文件
txt=file.read()
print(txt)
#关闭文件
file.close()
2. 以 gbk 编码格式打开文件
如果指定文件字符集编码不是 gbk,打开会报错
#打开文件
file=open(r"./data.csv","r",encoding="gbk")
#读取文件
txt=file.read()
print(txt)
#关闭文件
file.close()
第 2 章 文件操作------按行读取文件内容
一、readline ⽅法
readline 方法可以一次读取一行内容
⽅法执⾏后,会把⽂件指针移动到下⼀⾏,准备再次读取
readline 方法读取到文件最后,返回长度为 0 的字符串
二、readline读取文件一行内容
file=open(r"./data.csv","r")
txt=file.readline()
print(txt)
file.close()
hello,python
Process finished with exit code 0
三、结合 while 循环 readline 读取文件全部内容
file=open(r"./data.csv","r")
#在循环开始的时候,不知道文件有多少行,,所以也不能觉得循环多少次
while True:
txt=file.readline()
#如果readline读取到文件最后末尾,返回 “ ”
if txt =="":
break
print(txt,end="")
file.close()
hello,python
1,11
22,222
33,333
Process finished with exit code 0
四、readlines ⽅法
- readlines 方法可以一次读取文件所有行,返回类型为列表。
file=open(r"./data.csv","r")
# text 类型为 list,list 中每个成员就是文件 data.txt 的每一行
text = file.readlines()
# 遍历列表 text
for n in text:
# 显示 text 每个成员内容
print(n)
# 关闭文件
file.close()
hello,python
1,11
22,222
33,333
Process finished with exit code 0
五、with open 语法(重点)
- 这个语法不需要调用colse关闭文件
file=open(r"./data.csv","r")
text=file.read()
print(text)
file.close()
以上代码等价:
with open("./data.csv","r") as f:
text = f.read()
print(text)
第 3 章 JSON 操作
一、JSON 介绍
- JSON 的全称是”JavaScript Object Notation”,是 JavaScript 对象表示法,它是一 种基于文本,独立 于语言的轻量级数据交换格式。
二、JSON 特点
- JSON 是纯文本
- JSON 具有良好的自我描述性,便于阅读和编写
- JSON 具有清晰的层级结构
- 有效地提升网络传输效率
三、JSON 语法规则
- 大括号保存对象
- 中括号保存数组
- 对象数组可以相互嵌套;
- 数据采用键值对表示;
- 多个数据由逗号分隔;
四、JSON 值
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
五、JSON 文件读写
1.读取 JSON 文件:
创建data.json文件
{
"name":"tom",
"age": 20,
"addr": [1,2,3],
"qw": {"sex": "男"}
}
读取json文件:
import json
file=open("data.json","r",encoding="utf8")
data=json.load(file)
# 返回的 data 数据类型为字典或列表
print(data)
file.close()
{'name': 'tom', 'age': 20, 'addr': [1, 2, 3], 'qw': {'sex': '男'}}
Process finished with exit code 0
思考:data=json.load(file)----解释什么时候 返回的 data 数据类型为字典或列表?
- 看json文件的数据是列表还是字典
1.返回的是列表格式--json文件要写在列表里
[{
"name":"tom",
"age": 20,
"addr": [1,2,3],
"qw": {"sex": "男"}
}
]
- 此时返回的是列表
[{'name': 'tom', 'age': 20, 'addr': [1, 2, 3], 'qw': {'sex': '男'}}]
Process finished with exit code 0
2.返回的是字典格式---json文件要写在字典里
{
"name":"tom",
"age": 20,
"addr": [1,2,3],
"qw": {"sex": "男"}
}
- 此时返回的是字典
{'name': 'tom', 'age': 20, 'addr': [1, 2, 3], 'qw': {'sex': '男'}}
Process finished with exit code 0
2.写入 JSON 文件:
data = {'name': 'tom', 'age': 20, 'country': '中国'}
f = open('./temp.json', 'w', encoding='UTF-8')
json.dump(data, f, ensure_ascii=False)
f.close()
3. 课堂练习 --修改json文件内容(理解)
1.文件 data.json 内容如下:
{
"name":"tom",
"age": 20,
"addr": [1,2,3],
"qw": {"sex": "男"}
}
2.利用 json.load 与 json.dump 将 age 的值修改为 30
#思路:
# 先把内容从data.json文件中读取出来
# 读出来的结果是一个字典
# 把字典中键age对应的值修改30
# 再把字典写回到data.json文件中
file =open("data.json","r",encoding="utf8")
dict1=json.load(file)
file.close()
dict1["age"]=30
file=open("data.json","w",encoding="utf8")
json.dump(dict1,file,ensure_ascii=False)
file.close()
结果:
{"name": "tom", "age": 30, "addr": [1, 2, 3], "qw": {"sex": "男"}}
重点:
1,编写读取json文件函数 (list)
- 构建temp.json文件数据---json数据写在列表里
[
{
"desc": "case001 登录成功",
"login_data": {"mobile": "13800000002","password": "123456"},
"status_code": 200,
"success": true,
"code": 10000,
"message": "操作成功"
},
{
"desc": "case002 不输入手机号",
"login_data": {"mobile": "", "password": "123456"},
"status_code": 200,
"success": false,
"code": 20001,
"message": "用户名或密码错误"
}
]
- 编写函数脚本
import json
def build_data():
test_data=[]
# 指定文件路径
json_file="./temp.json"
# 打开json文件
with open(json_file,encoding="utf-8") as f:
# 将json文件转化为字典
jsondict_data = json.load(f)
for case_data in jsondict_data:
login_data =case_data.get("login_data")
status_code = case_data.get("status_code")
success = case_data.get("success")
code = case_data.get("code")
message = case_data.get("message")
test_data.append((login_data,status_code,success,code,message))
print(test_data)
return test_data
build_data()
打印结果:
[({'mobile': '13800000002', 'password': '123456'}, 200, True, 10000, '操作成功'), ({'mobile': '', 'password': '123456'}, 200, False, 20001, '用户名或密码错误')]
Process finished with exit code 0
1,编写读取json文件函数 (dict)
- 构建temp.json文件数据---json数据写在字典里
{
"case001 登录成功":
{
"login_data": {"mobile": "13800000002", "password": "123456"},
"status_code": 200,
"success": true,
"code": 10000,
"message": "操作成功"
},
"case002 不输入手机号":
{
"login_data": {"mobile": "", "password": "123456"},
"status_code": 200,
"success": false,
"code": 20001,
"message": "用户名或密码错误"
}
}
import json
def build_data():
test_data={}
# 指定文件路径
json_file="./temp.json"
# 打开json文件
with open(json_file,encoding="utf-8") as f:
# 将json文件转化为字典
jsondict_data = json.load(f)
for i in jsondict_data:
test_data[i]=jsondict_data[i]
#print(test_data)
print(i,test_data[i])
print(i,test_data[i]["login_data"])
return test_data
build_data()
case001 登录成功 {'login_data': {'mobile': '13800000002', 'password': '123456'}, 'status_code': 200, 'success': True, 'code': 10000, 'message': '操作成功'}
case001 登录成功 {'mobile': '13800000002', 'password': '123456'}
case002 不输入手机号 {'login_data': {'mobile': '', 'password': '123456'}, 'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'}
case002 不输入手机号 {'mobile': '', 'password': '123456'}
Process finished with exit code 0
2,编写读取CSV文件函数
异常包模块:
第 1 章 其他------异常
一、 异常的概念
-
程序在运⾏时,如果遇到到⼀个错误,会停⽌程序的执⾏,并且提示⼀些错误信息,这就是异常
-
程序停⽌执⾏并且提示错误信息这个动作,称之为:抛出(raise)异常
-
程序开发时,很难将所有的特殊情况都处理的⾯⾯俱到,通过异常捕获 可 以针对突发事件做集中的处理,从⽽保证程序的稳定性和健壮性
二、捕获异常
1. 简单的捕获异常语法
在程序开发中,如果对某些代码的执⾏不能确定是否正确,可以增加 try(尝 试) 来捕获异常
- 语法格式:
try:
可能出现异常的代码
except:
出现异常的处理代码
如果try下面的代码没出现异常,那么except下面的代码不会执行
只有try下面的代码出现异常,except下面的代码才会执行
一旦异常被try捕捉,那么程序就不会报错终止
- 演练 —— 要求⽤户输⼊整数
try:
num1 = int(input("请输入数字:"))
except:
print("请输入正确的数字")
请输入数字:3
Process finished with exit code 0
请输入数字:qwe
请输入正确的数字
Process finished with exit code 0
2. 捕获不同类型异常
- 在程序执⾏时,可能会遇到不同类型的异常,并且需要针对不同类型的异常, 做出不同的响应,这个时候,就需要捕获错误类型了。
演练---⽤户输⼊两个整数,显示两个整数相除后的结果
try:
a = int(input("请输入数字:"))
b = int(input("请输入数字:"))
print(a/b)
except ValueError:
print("请输入一个可以转换的数字")
except ZeroDivisionError:
print("除数不能为0")
except:
print("未知错误")
#ValueError :输入的值不能转换为整数
#ZeroDivisionError:除数不能为0
请输入数字:0
请输入数字:0
除数不能为0
Process finished with exit code 0
请输入数字:qwe
请输入一个可以转换的数字
Process finished with exit code 0
3. 捕获未知错误
在开发时,要预判到所有可能出现的错误,还是有⼀定难度的
如果希望程序⽆论出现任何错误,都不会因为 程序抛出异常⽽被终⽌,可 以再增加⼀个 except
- 语法格式
try:
可能出现异常的代码
except Exception as result:
出现未知异常的处理代码
- 演练 —— 两个变量,一个为整数,一个为字符串,显示两个变量相加的结果
try:
a="aaaa"
b=6
print(a + b)
except Exception as result:
print(result)
can only concatenate str (not "int") to str
Process finished with exit code 0
4. 没有异常发生才执行的代码
程序运行过程中,如果没有异常发生,需要执行一段代码。这个时候可以使用 else。
- 语法格式
try:
可能出现异常的代码
except Exception as result:
出现未知异常的处理代码
else:
没有异常执行的代码
- 演练 —— ⽤户输⼊两个整数,显示两个整数相除后的结果
try:
a = int(input("请输入数字:"))
b = int(input("请输入数字:"))
print(a/b)
except Exception as result:
print("未知错误{}".format(result))
else:
print("恭喜,没有异常发生")
请输入数字:2
请输入数字:1
2.0
恭喜,没有异常发生
Process finished with exit code 0
请输入数字:awe
未知错误invalid literal for int() with base 10: 'awe'
Process finished with exit code 0
5. 无论是否有异常,都要执行的代码
程序运行过程中,一旦发生异常,代码就会跳转到 except,有时需要不论发 生任何异常,都必须要执行一段代码。这个时候可以使用 finnly
- 语法格式
try:
可能出现异常的代码
except Exception as result:
出现未知异常的处理代码
finally:
无论是否有异常都要执行的代码
- 演练 —— ⽤户输⼊两个整数,显示两个整数相除后的结果
try:
a = int(input("请输入数字:"))
b = int(input("请输入数字:"))
print(a/b)
except Exception as result:
print("未知错误{}".format(result))
finally:
print("无论有无异常,都要执行")
请输入数字:2
请输入数字:1
2.0
无论有无异常,都要执行
Process finished with exit code 0
请输入数字:2
请输入数字:0
未知错误division by zero
无论有无异常,都要执行
Process finished with exit code 0
三、抛出异常
- 在开发中,除了代码执⾏出错时被动抛出异常之外, 还可以根据应⽤程序 特有的业务需求主动抛出异常。
- 抛出异常使用 raise 关键字,同时 Python 中提供了⼀个 Exception 异常类
主动抛出异常语法:
raise Exception(“异常描述”)
演练------提示⽤户输⼊密码,如果⻓度少于 8,抛出异常
str1 = input("请输入密码")
if len(str1) < 8:
raise Exception("密码长度不够")
else:
print("密码正确")
请输入密码12
Traceback (most recent call last):
File "D:\PycharmProjects\111\222\002.py", line 23, in <module>
raise Exception("密码长度不够")
Exception: 密码长度不够
Process finished with exit code 1
注意
如果通过 raise 抛出异常,但程序中没有使用 try 捕捉异常,程序会终止,所以完整
代码如下:
try:
str1 = input("请输入密码")
if len(str1) < 8:
raise Exception("密码长度不够")
else:
print("密码正确")
except Exception as result:
print(result)
请输入密码asd
密码长度不够
Process finished with exit code 0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律