我们需要长期稳定的保存数据,所以需要把数据保存到文件中。这样的操作称为数据的持久化存储。
Python中用于文件目录操作的常用模块有os(操作系统模块), shutil(shell工具),pathlib(目录操作),fileinput(批量文件操作)等。
一 . 打开文件
语法格式:
格式一:
f = open(file_name: str, access_mode: str="r")
#f称为‘管道对象’‘句柄对象’‘连接’‘通道’
格式二:
with 表达式 [as 变量]:
代码块
#with语句块在执行完以后,会自动帮我们执行file.close()方法,关闭文件
参数选项说明:
file_name:文件的存储路径和文件名,如果路径与运行的python入口文件在同一个目录下,可以省略不写。
access_mode:打开文件的访问模式
encoding:编码类型,常用编码:utf-8, gbk
常见的访问模式:
访问模式 | 说明[模式后面的+号,可以访问模式达到增强的作用,补全缺少的文件操作,例如:r本身只能支持读取内容,不能写入的,但是r+就具有了读取文件和写入文件内容的功能][文件指针就是我们平时输入文件时的光标。] |
r | 默认模式,以只读方式打开文件,不能修改文件。如果该文件不存在,则抛出异常。文件的指针将会放在文件的开头。 |
w | 以只写方式打开文件,只用于写入。如果该文件已存在则将其覆盖,如果源文件有内容则会被清空。如果该文件不存在,创建新文件。 |
a | 以追加写入内容方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。如果该文件不存在,则抛出异常。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
注意:
-
基于w,w+,wb,wb+模式打开的文件,原有内容会被截断清除。
-
基于a,a+,ab,ab+模式打开的文件,文件读写数据的光标会位于文件末尾,此时无法读取文件内容。
-
基于r,r+,rb,rb+模式打开一个不存在的文件都会报错。
二. 文件对象
1 常用属性
# 使用对象的属性,后面不需要小括号 file = open("./1.txt", "w") print(file.name) # ./1.txt, 打开的文件名 print(file.mode) # w 打开的文件的访问模式 print(file.closed) # False, 查看文件的关闭状态,False表示没关闭 file.close() print(file.closed) # True, 表示当前文件已经关闭了管道
2 常用操作
方法 | 描述 |
file.write(str: string) | 写入文件内容,将字符串或二进制数据写入被打开的文件。 |
file.read([n=-1]) | 读取文件内容,读取出来的内容是字符串也可以是二进制数据。读取过程中,如果设置了n,则最多读取文件中的n个字符,如果没有设置则默认为-1,则默认读取文件中的全部内容字符。 |
file.readline([limit=-1]) | 读取文件的一行内容,如果设置了limit,有可能返回的只是一行的limit个字符。如果没有设置则默认读取整行内容。 |
file.tell() | |
file.seek(offset: int) | 设置文件读写数据的光标(指针)到指定的offset指定位置 |
file.flush() | 把缓冲区的内容写入硬盘的文件中。默认情况下,程序写入内容到文件中,并不是逐行代码逐行写入,而是在运行过程中把写入文件的数据先保存到了内存的缓冲区中。 |
file.writelines(seq) | 把列表中的成员数据写入到文件中,就是多行一次性写入 |
file.readlines() | 按行读取整个文件内容,以列表格式返回,列表的成员是文件的每一行内容。 |
file.truncate(size: int = None) | 把文件裁成指定大小。文件必须以写方式打开,但w和w+除外。 |
file.writable() | 判断当前打开文件是否可写 |
file.readable() | 判断当前打开文件是否可读 |
3 实例
""把序列类型中的数据逐行写入""" # # 使用write把列表中的数据逐行写入 # data = ["君不见黄河之水天上来,奔流到海不复回。", "君不见高堂明镜悲白发,朝如青丝暮成雪。", "人生得意须尽欢,莫使金樽空对月。"] # file = open("1.txt", "w", encoding="utf-8") # for item in data: # file.write(f"{item}\n") # file.close() # data = ["床前明月光。\n", "疑似地上霜。\n", "举头望明月,\n", "低头思故乡。\n"] # file = open("1.txt", "w", encoding="utf-8") # file.writelines(data) # file.close() """ 读取数据 file.read(n=-1) # 读取文件所有内容,如果有指定参数选项n,则表示本次读取数据只读取n个字符 file.readline() # 读取文件的一行内容 """ """按字符串读取文件内容""" # file = open("1.txt", "r", encoding="utf-8") # data = file.read(5) # 本次读取5个字符 # print(data) # data = file.read() # print(data) # 读取剩余内容的全部 # file.close() """按行读取文件内容""" # file = open("1.txt", "r", encoding="utf-8") # content = file.readline() # print(content) # content = file.readline() # print(content) # content = file.readline() # print(content) # 读取大文件可以使用这个方式 # file = open("1.txt", "r", encoding="utf-8") # while True: # content = file.readline() # if not content: # 切记:要加判断,如果读不到内容了就退出循环 # break # print(content) """一次性把文件所有内容以列表方式,逐行读取返回""" # # 大文件千万不要这么读取, 小文件可以。占用内存大 # file = open("7.txt", "r", encoding="utf-8") # print( file.readlines() ) 文本格式文件[str,byte] 二进制格式文件(png) 1个字节长度 = 8bit---> 0000 0000 对于中文: utf-8: 1个字符长度 = 3个字节长度 gbk : 1个字符长度 = 2个字节长度 字母/数字/符号 1个字符长度 = 1个字节长度 file = open("8.txt", "a+", encoding="utf-8") content = file.read() print(content) point = file.tell() print(point) # 183 # 把指针位置移动到文件开头 file.seek(0) point = file.tell() print(point) # 0 content = file.read(5) print(content) # 君不见黄河 point = file.tell() print(point) # 15
4 扩展:
字符串和bytes类型数据可以写入到文件中。
如果是其他格式写入到文件中,最好先转换成字符串/bytes类型以后再写入,工作中,一般使用json/base64的格式写入
"""扩展: json json.dumps() # 把列表/字典/元组转换成一个json编码格式字符串 json.loads() # 把一个json编码格式字符串还原成字典或者列表 """ # # 把一个非字符串的数据(列表/字典/元组)写入文件中 # import json # file = open("6.txt", "w") # data = {"id": 1, "name":"xiaoming"} # content = json.dumps(data) # print(content, type(content)) #{"id": 1, "name": "xiaoming"} <class 'str'> # file.write(content) # # 把上面的内容从文件中提取还原 # import json # file = open("6.txt", "r") # content = file.read() # print(content, type(content)) #{"id": 1, "name": "xiaoming"} <class 'str'> # data = json.loads(content) # print(data, type(data)) #{'id': 1, 'name': 'xiaoming'} <class 'dict'> """扩展:base64 base64.b64encode() # 把其他任意数据类型转换成字符串 base64.b64decode() # 把bas64编码类型的字符串还原成原有格式数据 """ # base64可以转换一切数据格式成字符串 # import json, base64 # file = open("6.txt", "w") # data = [{"id": 1, "name": "xiaoming"}] # byte_data = json.dumps(data).encode() #byte格式 encode() 编码 将字符串转化为字节流(Bytes流) # content = base64.b64encode(byte_data).decode()。 #str格式 decode() 解码 将Bytes流转化为字符串 # print(content, type(content)) # file.write(content) # # 把上面的内容从文件中提取还原 # import json, base64 # file = open("6.txt", "r") # content = file.read() # print(content, type(content)) # data = base64.b64decode(content).decode()#str格式 # print(data, type(data)) # [{"id": 1, "name": "xiaoming"}] <class 'str'> # dict_data = json.loads(data) # print(dict_data) # [{'id': 1, 'name': 'xiaoming'}]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)