共计 2910 个字符,预计需要花费 8 分钟才能阅读完成。
一、读操作
1、读文件
-
过程
a、找到文件
b、打开文件
c、读取文件的内容
d、关闭文件
-
找到文件
绝对路径:从根目录开始链接的路径
相对路径:不是从根目录开始链接的路径
path = r"file.txt"
-
打开文件
-
原型
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
-
参数
file:要打开的文件的路径
mode:打开方式
encoding:编码格式
errors:错误处理方式(ignore 表示直接忽略)
-
返回值
文件描述符,从当前的位置操作当前打开的文件
-
打开方式
方式 说明 r 以只读的方式打开文件,文件的引用 (描述符) 将会被放在文件开头 rb 以二进制格式打开只读文件,文件的引用 (描述符) 将会被放在文件开头 r+ 以读写的方式打开文件,文件的引用 (描述符) 将会被放在文件开头 w 以只写的方式打开文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件 wb 以二进制格式打开只写文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件 w+ 以读写的方式打开文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件 a 打开一个文件用于追加内容,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件 a+ 打开一个文件用于读写,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件 -
打开
打开普通文件
fp = open(path, "r")
打开二进制文件
fp = open(path, "rb")
指定编码格式
fp = open(path, "r", encoding="utf-8")
指定错误处理方式
fp = open(path, "r", encoding="utf-8", errors="ignore")
-
-
读取文件的内容
-
读取文件的全部内容
str1 = fp.read() print(str1)
-
读取指定字节数的内容
str2 = fp.read(4) print(str2)
-
读取整行内容(包括 \n 字符)
str3 = fp.readline() print("*"+str3+"*")
-
读取指定字节数内容
str4 = fp.readline(13) print("*"+str4+"*")
-
读取所有行并返回一个列表,列表中的元素是每行内容
list5 = fp.readlines() print(list5)
-
-
修改文件描述符的位置
str6 = fp.read(4) print("*"+str6+"*") str7 = fp.read(4) print("*"+str7+"*") # 修改文件描述符的位置 fp.seek(1) str8 = fp.read(4) print("*"+str8+"*")
-
关闭文件
-
注意
文件使用过后必须关闭
-
原因
释放资源,系统能打开的文件个数是有限制的,所以需要释放相应文件的文件描述符
-
关闭方式
程序结束自动关闭:程序结束时会释放文件对象的空间,文件会关闭,但是不建议这样来做,最好手动关闭
手动关闭:调用代码关闭
-
示例
fp.close()
-
2、读文件完整过程
try:
fp = open("file.txt", "r")
print(fp.read())
finally:
if fp:
fp.close()
3、读文件简写方式
with open("file.txt", "r") as fp:
print(fp.read())
二、写操作
1、写文件
-
过程
- 找到文件
- 打开文件
- 将内容写入缓冲区,此时内容没有写入文件
- 刷新缓冲区,直接把缓存区中的数据立刻写入文件
- 关闭文件
-
刷新缓冲区方式
- 程序结束
- 关闭文件
- 手动刷新
- 缓冲区满了
- 遇到 \n
-
找打文件
path = "file.txt"
-
打开文件
fp = open(path, "w")
-
将内容写入缓冲区
fp.write("sunck good")
-
手动刷新缓冲区
fp.flush()
-
关闭文件
fp.close()
2、写文件完整过程
try:
fp = open("file.txt", "w")
fp.write("cool man")
finally:
if fp:
fp.close()
3、写文件简写方式
with open("file.txt", "w") as fp:
fp.write("cool man")
三、编码与解码
1、编码
with open("file.txt", "wb") as fp:
s = "sunck is a good man 凯"
s = s.encode("utf-8")
fp.write(s)
2、解码
with open("file.txt", "rb") as fp:
s = fp.read()
s = s.decode("utf-8")
print(s)
3、chardet 模块
-
作用
使用 chardet 检测编码,支持检测中文、日文、韩文等多种语言
-
安装
pip install chardet
-
使用
import chardet # 注意:数据量小,猜测的不准 data = "凯哥是一个好男人".encode("gbk") # print(data) ret = chardet.detect(data) print(ret, type(ret)) ''' encoding:表示编码格式 confidence:表示检测的正确的概率 language:表示数据的语言 ''' '''GBK 是 GB2312 的超集,两者是同一种编码''' info = data.decode(ret["encoding"]) print(info)
四、特殊的读写
1、list、tuple、dict、set 的文件操作
-
pickle 模块
持久化保存对象,将 list、tuple、dict、set 等数据序列化存储到文件
import pickle
-
存储
user = {"account": "sunck", "passwd": "666"} with open("file.txt", "wb") as fp: pickle.dump(user, fp)
-
读取
with open("file.txt", "rb") as fp: user = pickle.load(fp) print(user, type(user))
2、StringIO
-
作用
数据的读写不一定都是文件,也可以是内存中读写,StringIO 可以在内存中读写字符串
-
导入
from io import StringIO
-
写
fp = StringIO() fp.write("sunck is\n") fp.write("a good") fp.write("man!") # 获取写入的内容 print(fp.getvalue())
-
读
fp.seek(0) print(fp.read()) fp.seek(0) print(fp.readline()) fp.seek(0) print(fp.readlines())
注意:文件使用后关闭文件
3、BytesIO
-
作用
数据的读写不一定都是文件,也可以是内存中读写,StringIO 只能操作字符串,BytesIO 可以操作二进制数据
-
使用
from io import BytesIO fp2 = BytesIO() fp2.write("sunck is a nice man".encode("utf-8")) fp2.seek(0) print(fp2.read().decode("utf-8")) fp2.close()
正文完
星哥玩云-微信公众号