随笔 - 65  文章 - 0 评论 - 0 阅读 - 28529
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

我们需要长期稳定的保存数据,所以需要把数据保存到文件中。这样的操作称为数据的持久化存储。

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+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

注意:

  1. 基于w,w+,wb,wb+模式打开的文件,原有内容会被截断清除。

  2. 基于a,a+,ab,ab+模式打开的文件,文件读写数据的光标会位于文件末尾,此时无法读取文件内容。

  3. 基于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() 获取当前文件中读写数据的光标(指针)所在位置。 1. 基于r、r+、w、w+模式打开文件,默认位置是0,表示文件开头 2. 基于a或a+模式打开的文件,默认值是文件内容的末尾下标位置。 3. 刚执行完file.read()的文件,光标所在位置,是在file.read()读写内容的后面位置。
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'}]
复制代码

 

posted on   大明花花  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示