引言
今天学习的是文件的IO流和异常处理,和java有点类似,我好像是找到家了的感觉。现在是23点30,我们开始今天的博客之旅吧!
一.IO流
1.文件读取操作 open(file,mode='r',encoding=None)
这个函数里面参数很多,我就写了三个常用参数
file:读取的文件
mode:权限,分为只读r,只写w,追加a,二进制读写b,所以常用的权限有,‘a','r','w','ab','rb','wb'
encoding: 编码格式,常用utf-8
用完需要用close()方法关闭io流
返回值是一个文件对象
file_obj = open("info.txt", mode="r")
print(file_obj)
file_obj.close()
#<_io.TextIOWrapper name='info.txt' mode='r' encoding='cp936'>
2.读取文件对象的值 read(file_obj)
file_obj上上面方法的返回值,文件读取对象
file_obj = open("info.txt", mode="r")
print(file_obj)
data = file_obj.read()
print(data)
# aabbccddaabbccdd
# 1212121212
# 3433434343
# 565656656
3.写入文件对象的值 write(file)
old_txt = "info.txt"
old_img = r"C:\Users\32979\Pictures\猫羽雫 蓝色眼睛女子 尾巴 女孩子 猫耳.jpg"
#读取操作
img1 = open(old_img, mode="rb") #可以进行读
content = img1.read()
print(content)
#写入操作
img1.close()
#targe参数是目标文件,也就是需要写入的文件
#’wb'参数是用二进制写入,如果没有targe这个文件夹,不会报错,会自己创建
img2 = open("pycharm.webp",mode="wb")
#write参数必须是读取出来的对象
img2.write(content)
img2.close()
4.文件追加时,重新定位光标 seek()
f = open("info.txt",mode = "a+")
# a只具有追加功能,不能读取 。王三,将其在张五中间。a+追加的基础上可以读的操作
# # 一个unicode汉字2个字节。如果是utf-8 一个汉字3个字节。gbk占两个字节
f.write("aabbccdd")
# # 光标,又称为游标
f.seek(0)
data = f.read()
print(data)
5.csv文件操作
1.认识csv文件
csv文件类似于excel中的表,或者说列表。第一行是标题头,下面的都是各个标题所对应的值。
下面是一个csv文件
name,age,weight
aa,20,30
bb,20,40
cc,30,28
2.csv读取文件 DictReader()
参数是需要读取的csv文件,返回值是一个迭代器,因为csv是一个列表,读取以后他会把标题头当作键值,每一行数据当作值,封装成一个字典,每一行一个字典,所以返回值是一个迭代器对象,显示数据的话需要迭代
with open("test.csv","r") as file:
read = csv.DictReader(file)
print(read)
for i in read:
print(i)
# {'姓名': 'aa', '年龄': '20', '成绩': '30'}
# {'姓名': 'bb', '年龄': '20', '成绩': '40'}
# {'姓名': 'cc', '年龄': '30', '成绩': '28'}
3.csv写入操作 DictWrite() writeHeader() writerows()
import csv
# 假设我们要写入CSV文件的列名
fieldnames = ['name', 'age', 'city']
# 打开一个文件用于写入(如果文件已存在,则会被覆盖)
with open('example.csv', 'w', newline='') as csvfile:
# 创建一个csv.DictWriter对象,指定要写入的文件对象和列名
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# 写入一行表头(列名)
writer.writeheader()
# 写入一些数据行
writer.writerow({'name': 'Alice', 'age': 24, 'city': 'New York'})
writer.writerow({'name': 'Bob', 'age': 27, 'city': 'Los Angeles'})
# 或者,你可以一次性写入多行数据(作为一个字典列表)
rows = [
{'name': 'Charlie', 'age': 22, 'city': 'Chicago'},
{'name': 'David', 'age': 30, 'city': 'Boston'}
]
writer.writerows(rows)
6.xml文件操作
# 导入ElementTree包
from xml.etree import ElementTree as ET
# 先使用et生成et 文件
tree = ET.parse("data.xml")
# tree.getroot 获取根目录的标签。 根目录的标签地址
# 可以用对象来获取相关的值,两个方法都可以
root = tree.getroot()
# root = ET.XML(connt)
# 一旦得到root对象,对立面的值进行读取
country_obj = root.find("country")
print(country_obj)
# 对象来获取里面的相关内容
print(country_obj.tag)
# 标签内的名字
print(country_obj.attrib)
7.json文件操作
json文件类似python中的字典类型。{“key”:“value”}
1.json文件写入操作 dump(python数据,写入的目标json文件)
import json
data = {"aaa4444":"1235664"}
f = open("stu.json","w") # 写一个文件,控制文件权限
# 将python转化为json 进行写入f
json.dump(data,f)
f.close()
2.json文件读取操作
with open("stu.json","r") as f:
print(f.read())
8.with...as上下文管理器
使用这个上下文管理器的话不用关闭IO流了
with open('stu.json','w') as f:
# json.dump(data,f)
f.write(json.dump(data))
二.异常
当程序被逼停,但后面的内容还要运行。处理掉
异常的处理:
- 直接是控制台抛出
- 捕获异常
第一种情况
try:
程序正常运行的代码块
except:
执行抛出异常的代码块
第二种情况
try -except -else:
如果抛出异常执行的except的内部代码块。
如果程序正常,正常执行else里面的代码块。
在实际开发中,遇到一道,抛出继续。
主动触发异常格式:
raise 异常
第三种情况
assert断言 报错是(AssertionError)
用于判断一个表达式,当表达式为false时,自动触发断言异常
结语
现在是北京时间00:20,虽然内容很少,但是还是花了50分钟整理,因为我觉得csv这个文件格式在后面爬虫的时候遇到挺多的,所以多看了一下,今天是python初学者,梦想是做月入过万的数据分析师或者爬虫工程师,mai起!