IO在计算机编程中指的是输入和输出。IO编程中,Stream(流)是一个很重要的概念。IO有同步IO和异步IO两种,同步和异步的区别就在于是否等待IO执行的结果。读写文件是常见的IO操作。
1. 文件
1.1 打开文件
open():打开文件,返回一个stream(流对象)
使用方法:open(file, mode='r', buffering=None, encoding=None, errors=None...............)
- file:文本文件、二进制字符串、文件路径(使用相对路径或绝对路径表示)
- mode:打开文件的模式
- r:读模式打开(默认)
- w:写入模式打开,先清空文件,不存在则创建文件
- x:创建新文件,以写入模式打开
- a:以追加写入模式打开,不存在则创建文件
- b:二进制模式打开
- t:文本模式(默认)
- +:读写模式打开
- encoding:打开文件使用的编码(与写入文件使用的编码相同才能正常读取)
1.2 关闭文件
- close():close()方法用来关闭文件
- 建议完成操作后总是关闭文件,打开的文件会占用系统资源
file = open("test.txt")
# 操作
file.close() # 关闭文件
- try----finally方式:
try:
file = open("test.txt")
# 操作
finally:
file.close()
- with-----open-----as-------方式:推荐使用,会自动调用close()方法关闭文件
with open("test.txt") as f:
# 操作
1.3 读取文件
- read():一次读取所有内容并返回,适用于文件较小时使用
- read(size):读取一定数量数据并返回。文本模式下(rt),表示读取指定字符数;二进制模式下(rb),表示读取指定字节数。UTF8编码下,英文字符一个字节,汉字三个字节
- readline():读取一行并返回
- readlines():读取所有行并以列表形式返回(包括换行符)
# 读取文件
# read():读取所有并返回,一般用于文件较小时读取
with open("python.txt", "r") as file:
content = file.read()
print(content)
# read(size):文本模式下读取指定字符数返回;二进制模式下表示读取指定字节返回(utf8编码,英文1个字节,汉字3个字节)
with open("python.txt", "r") as file:
content = file.read(20)
print(content)
with open("python.txt", "rb") as file:
content = file.read(20)
print(content)
# readline():读取一行并返回
with open("python.txt", "r") as file:
line = file.readline()
print(line)
# readlines():读取所有行包括换行符并以列表形式返回
with open("python.txt", "r") as file:
line_list = file.readlines()
print(line_list)
1.4 写入文件
- write():写入字符串到文件,并返回写入的字符串数量(二进制模式返回写入的字节数)
# 写入文件:以写入模式(w,a,x,t,b)打开,使用write()方法进行写入,返回添加的字符数(二进制模式返回添加的字节数)
with open("python.txt", "a") as file:
add_num = file.write("这是我自己添加的一行!!!")
print(add_num)
with open("python.txt", "ab") as file:
add_num = file.write("这是我自己添加的一行!!!".encode("utf-8"))
print(add_num)
1.5 文件指针
- tell():返回当前文件指针所在位置(字节数)
- seek():修改文件指针位置(通过字节偏移量)
- seek(self, offset: int, whence: int = 0)
- offset:字节偏移量
- whence:相对位置(默认为文件开始位置)0 文件开头 1 当前位置 2 文件末尾
with open("python.txt", "r") as file:
print(file.tell()) # 起始指针位置
file.read(20) # 读取20个字符
print(file.tell()) # 读取指定字符后指针位置(字节数)
file.seek(0) # 移动指针到指定位置(此处为文件开头)
print(file.tell()) # 手动移动指针后指针位置
1.6 文件迭代
-
基本概念:
- 循环:满足条件的情况下,重复执行某段代码
- 迭代:按照某种顺序访问线性结构中的每一项
- 遍历:按一定规则访问非线性结构的每一项
- 递归:一个函数不断调用自身的行为
-
判断一个对象能否迭代
from collections import Iterable isinstance(obj, Iterable)
iter():生成一个迭代器,使用next()函数不断获取下一个值
-
按行迭代:
# 文件迭代:按行迭代 with open("python.txt", "r") as file: while True: line = file.readline() print(line) if not line: break with open("python.txt", "r") as file: for line in file: print(line)
2. StringIO和BytesIO
2.1 StringIO:在内存中读写str
from io import StringIO
file = StringIO("hello\n world \n name.") # 创建StringIO对象并使用字符串进行初始化
print(file.read()) # 读取StringIO对象的内容
file.write("hello python")
print(file.getvalue()) # 获取StringIO对象写入后的内容
2.2 BytesIO:读写二进制数据
from io import BytesIO
file = BytesIO("你好".encode("utf-8")) # 创建并初始化BytesIO对象
print(file.read().decode("utf-8")) # 读取内容并解码
file.write("中国".encode("utf-8")) # 向BytesIO对象写入内容(二进制,需要编码)
print(file.getvalue().decode("utf-8")) # 获取写入后的内容并解码
3. 序列化与反序列化
把对象的状态信息变成可存储或传输的过程称之为序列化(二进制格式)。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。python使用pickle模块实现数据的简单序列化和反序列化。
3.1 序列化
- pickle.dumps(obj):将对象序列化为bytes(此时可用wb格式打开文件并写入)
- pickle.dump(obj, file):直接序列化并写入文件
# 序列化与反序列化
import pickle
# 序列化:将对象状态信息变为可存储或者可传输的过程称为序列化(变为二进制格式)
mydict = {"name":"fengdi", "age":22, "language":"python"}
mydict_pickle = pickle.dumps(mydict) # 序列化为二进制模式,此时可写入文件或进行传输
print(mydict_pickle)
with open("pickle.txt", "wb") as file: # 以二进制写入模式打开并写入
file.write(mydict_pickle)
with open("pickle.txt", "rb") as file:
content = file.read()
print(content)
mylist = ["python", "java", 10, 20] # 直接序列化对象并写入文件
with open("pickle.txt", "wb") as file:
pickle.dump(mylist, file)
with open("pickle.txt", "rb") as file:
content = file.read()
print(content)
3.2 反序列化
- pickle.loads(obj):反序列化bytes文件(应先从文件中读取出来)
- pickle.load(file):直接从文件中读取bytes并反序列化
# 反序列化
with open("pickle.txt", "rb") as file:
content = file.read() # 二进制模式
print(pickle.loads(content)) # 从二进制模式反序列化(需要先以二进制模式将内容读取出来)
with open("pickle.txt", "rb") as file: # 直接从文件中反序列化为对象
content = pickle.load(file)
print(content)
4. python和json格式转换
- json格式是标准格式,与python类型的对应关系:
python类型 | json类型 |
---|---|
dict | { } |
list | [ ] |
str | " " |
int float | 1234.56 |
True False | true false |
None | null |
- 转换方法和序列化反序列化类似:
- json.dumps(obj):将python对象转换为json对象
- json.dump(obj, file):将python对象转换为json对象并写入文件
- json.loads(obj):将json对象转换为python对象 (应先从文件中读取出来)
- json.load(file):直接从文件中读取并转换为python类型