1.文件操作
把文件打开
open 打开 f = open ('文件路径',mode='模式',encoding='编码格式') #打开一个文件操作的时候取到的是一个句柄
读取的方法
. read() 将文件中的内容全部读取出来. 弊端: 占内存.如果文件过大,容易导致内存崩溃
. read(n) 默认:读去文件内容全部read(n) 读取n个字符 . readline() 一次读取一行数据 , 注意每次读出来的数据都会有一个 需要使用strip()去空格 . readlines() 读取全部. 返回列表,也容易出现内存崩溃的问题,不建议使用
for line in f: 每次读取一行内容
print(line.strip())
1. 只读( r , rb) 读取文件的相关操作
rb. 读取出来的数据是bytes类型, 在rb模式下, 不能选择encoding字符集
rb的作用: 在读取非文本文件时,比如读取MP3.图像. 视频等信息的时候就需要用rb. 因为这种数据没办法直接显示出来
2. 只写(w , wb)
w 写入,只写,如果没有文件会创建文件,文件存在会清空文件,再写入新的内容
wb 模式下,可以不指定打开文件的编码.但是在写文件的时候必须将字符串转化成utf-8的bytes数据
3. 追加(a ,ab)
追加模式下,写入的内容会追加在文件的末尾. 追加写读所有带b的操作就是对bytes进行操作, 主要用于非文本文件的时候比如音频 图片 视频rbwb就适用这个
可用于断点续传.
a模式也可以创建文件
4. 读写 (r+ , r+b)
读写模式必须是先读,因为默认光标是在开头的
r+ 模式下必须先读取再写入
5. 写读 (w+ , w+b)
先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用
6. 写读(追加 写读)a+
a+模式下,不论是先读还是后读,都是读取不到数据的,因为追加之后光标在末尾,如果需要读取数据要移动光标seek
二.文件操作中关于文件句柄的相关操作
1. seek() 移动光标
seek:两个参数 1. 表示偏移量 2. 从xxx开始偏移, 默认0, 开头 1, 当前位置 2, 末尾
f.seek(0) 移动到开头
f.seek(0, 2) 移动到末尾, seek的第二个参数表示的是从哪个位置进行偏移, 默认是0, 表示开头, 1表示当前位置 2表示结尾
2. tell()返回光标所在的位置
print(f.tell())
3. truncate() 截断文件
f = open("文件1", mode="w", encoding="utf-8") f.write("哈哈") # 写入两个字符 f.seek(3) # 光标移动到3, 也就是两个字中间 f.truncate() # 删掉光标后面的所有内容 f.close() f = open("文件1", mode="r+", encoding="utf-8") content = f.read(3) # 读取12个字符 f.seek(4) print(f.tell()) f.truncate() # 后面的所有内容全部删掉 # print(content) f.flush() f.close()
三.文件修改
文件修改的步骤
1.先从文件中读取数据
2.把要修改的内容修改
3.写入新文件
4.删除旧文件
5.给新文件改名
# 导入os模块 os表示操作系统 import os # f = open("夸一夸123", mode="r", encoding="utf-8") # f2 = open("夸一夸123_副本", mode="w", encoding="utf-8") # with会自动的帮我们关闭文件的链接 with open("夸一夸123", mode="r", encoding="utf-8") as f, open("夸一夸123_副本", mode="w", encoding="utf-8") as f2: for line in f: if "好人" in line: line = line.replace("好人", "sb") f2.write(line) # time.sleep(3) # 程序暂停3秒 这里让程序暂停就是为了直观的显示功能,计算机处理速度过快 看不出来 # 删除原来文件 os.remove("夸一夸123") # 重命名副本为原来的文件名 os.rename("夸一夸123副本", "夸一夸123")
一个重要的练习:
名字 数量 价格 数量 香蕉 1 85 50 苹果 2 60 30 编号,名称,价格 1,香蕉,1,85 2,苹果,2,6 要想获得这些数据 f = open("水果.txt", mode="r", encoding="utf-8") lst = [] for line in f: # 1,香蕉,1.85,50 dic = {} # 每行都是一个字典 line = line.strip() # 去掉空白 1,香蕉,1.85,50 a, b, c, d = line.split(",") # [1, 香蕉, 1.85, 50] dic['id'] = a dic['name'] = b dic['price'] = c dic['totle'] = d lst.append(dic) print(lst) # f = open("水果.txt", mode="r", encoding="utf-8") # line = f.readline().strip() # 第一行内容, 编号,名称,价格,数量,哈哈 # h,i,j,k = line.split(",") # lst = [] # for line in f: # 1,香蕉,1.85,50 # dic = {} # 每行都是一个字典 # line = line.strip() # 去掉空白 1,香蕉,1.85,50 # a, b, c, d = line.split(",") # [1, 香蕉, 1.85, 50] # dic[h] = a # dic[i] = b # dic[j] = c # dic[k] = d # lst.append(dic) # # print(lst) f = open("水果.txt", mode="r", encoding="utf-8") line = f.readline().strip() # 第一行内容, 编号,名称,价格,数量,哈哈 title = line.split(",") # [编号,名称,价格,数量,哈哈] lst = [] i = 0 for line in f: # 1,香蕉,1.85,50 dic = {} # 每行都是一个字典 line = line.strip() # 去掉空白 1,香蕉,1.85,50 data = line.split(",") # [1, 香蕉, 1.85, 50] for i in range(len(title)): dic[title[i]] = data[i] lst.append(dic) print(lst)