文章目录
什么是文件IO?
文件IO: 通过程序操作计算中文件内容数据的一种技术
文件: 泛指计算机硬盘上的文件
I: input,输入,表示程序中读取文件中的内容
O:output,输出,表示程序中的数据输出/保存到文件中
文件的分类
-
基于文件的用途,文件表象上的宏观分类:
- 文本文档,视频文件,音频文件,图片文件,word文档
-
基于文件的组成,文件底层的数据组织方式
- 文本文件:底层是字符数据组成的,使用记事本软件正确打开文件内容
- 二进制文件:底层是字节数据组成的,使用记事本软件打开出现乱码的文件
open() 函数
open()函数是 python提供的内建函数,专门用于操作文件内容的一个功能函数
参数 file:第一个参数,描述的要打开的文件,可以是绝对路径,也可以是相对路径
参数 mode:第二个参数,描述打开文件的方式,也称为操作文件的权限
参数 encoding:描述操作文本文件的编码方式
mode参数指定的权限(r,w,x,a,b,t,+
)
rt :文件的默认打开方式,读取文本文件内容,可以省略
wt :覆盖写入文本文件,可以省略 t
at :追加写入文本文件,可以省略 t
rb : 读取二进制文件内容
wb :覆盖写入二进制文件
ab : 追加写入二进制文件
操作文本内容
读取文本内容
# 打开文件
file = open("cs.txt", "r", encoding="utf-8")
# 读取内容,打印
content = file.read()
print(content)
# 关闭文件
file.close()
写入字符到文本文件
# 打开文件
file = open("cs.txt", "r", encoding="utf-8")
# 写入字符数据
file.write("你好,世界!")
# 关闭文件
file.close()
操作二进制文件
读取二进制数据
# 1. 打开文件,以二进制的方式读取(二进制文件不需要设置字符编码)
file = open("mm.jpg", "rb")
# 读取数据
content = file.read()
print(content)
# 关闭文件
file.close()
写入二进制数据
# 字符数据
msg = "你好,世界!"
# 以二进制方式打开文件
file = open("text.dat", "wb")
# 写入字节数据(可以通过编码方式将字符数据转换为字节数据)
file.write(msg.encoding("UTF-8"))
file.close()
大文件的复制(二进制文件)
文件内容较多,体积较大的文件的复制操作,涉及到文件内容的读取和写入操作。
二进制文件执行read()方法时 :一次性将所有数据读取到内存中(文件体积较大,读取文件相当耗费内存!)
read([size])
此时可以指定每次读取的数据大小,单位字节;如每次读取 1024字节–>1K 数据。
如果进行大文件的复制,需要循环读取文件内容数据,最终完成文件的所有内容复制粘贴!
"""大文件的复制操作"""
def file_copy(old_path, new_path):
# 以读取方式打开 原路径
old_file = open(old_path, "rb")
# 以写入方式打开 新路径
new_file = open(new_path, "wb")
# 设置每次读取的数据大小 设置为 10M
buffer = 1024 * 1024 * 10
while True:
# 循环读取,每次读取 10M 大小数据
content = old_file.read(buffer)
# 如果读取到的内容为空,则说明已经读取完
if content == b"":
print("读取完毕!")
break
# 写入新文件
new_file.write(content)
print("复制完成!")
file_copy(原文件,拷贝到的位置)
程序中数据的保存
计算机中的文件存储的时字符数据或者字节数据,对应了程序代码中的字符数据和字节数据,但是程序中还有其它类型的数据,如列表,字典等等,这些数据存储到文件中时,应该怎么处理?
**解决方法:**将程序中其它类型的数据,转换成字符数据或者字节数据进行操作
字符操作方式
Python语法中提供了 json模块,可以将程序中的各种类型的数据转换成类似字典格式的字符串数据,称为json数据
- json.dump(obj,fp) 将程序中的一个对象数据(列表,字典等等)写入到一个打开的文件中
- json.load(fp) 将文件中的内容,转换成 python中的对应的对象数据
1. 将数据保存到文本文件中
import json
dct1 = {
"name": "zong",
"pwd": "zong"
}
dct2 = {
"name": "admin",
"pwd": "admin"
}
lst = [dct1, dct2]
file = open("./cs.txt","w",encoding="utf-8")
json.dump(lst, file)
file.close()
2. 将文本文件中的数据读取到程序中
import json
file = open("./cs.txt", "r", encoding="utf-8")
lst = json.load(file)
print(lst)
file.close()
字节操作方式
Python语法中提供了 pickle 模块,用于程序中的数据有组织的保存到二进制文件中
- dump(obj,fp) 将程序中的一个对象数据(列表,字典等等),写入到一个二进制文件中
- load(fp) 将文件中的字节数据,转换成python中对应的对象数据
1. 保存数据到文件中
import pickle
dct1 = {
"name": "zong",
"pwd": "zong"
}
dct2 = {
"name": "admin",
"pwd": "admin"
}
lst = [dct1,dct2]
file = open("cs.dat","wb")
pickle.dump(lst,file)
file.close()
2. 从文件中读取数据
import pickle
file = open("./cs.zong","rb")
lst = pickle.load(file)
print(lst)
file.close()
小结
上述 json模块 和 pickle模块,都只能在一个文件中操作一个对象数据,当然我们也可以将多个对象数据包含在一个列表容器中,解决存储多个数据的问题。
Python中同样提供了其它的操作模块可以非常友好的完成数据的交互,如 marshal模块可以序列化多个数据,shelve模块可以按照字典的方式组织序列化数据等等
csv模块
csv文件时按照行列式 存储数据的一种方式,是一个文本文件,可以使用 excel软件直接打开希纳是为表格格式,Python中提供了一个 csv模块用于专门操作 csv文件
import csv
dir(csv)
['excel', 'excel_tab', 'field_size_limit', 'get_dialect', 'list_dialects', 're', 'reader', 'register_dialect', 'unix_dialect', 'unregister_dialect', 'writer']
存储数据到csv文件
import csv
file = open("text.csv", "w", newline="", encoding="UTF-8-sig")
# 获取csv的writer对象
writer = csv.writer(file)
# 写入标题
writer.writerow(["姓名", "年龄", "性别", "邮箱"])
# 写入多行数据
writer.writerows([
["tom", "18", "男", "tom@qq.com"],
["jimi", "21", "男", "jimi@qq.com"],
])
file.close()
读取csv文件中的数据
import csv
file = open("text.csv", "r", encoding="UTF-8-sig")
reader = csv.reader(file)
for row in reader:
print(row)
file.close()