1.文件操作
把文件打开
open 打开f = open ('文件路径',mode='模式',encoding='编码格式')#打开一个文件操作的时候取到的是一个句柄
读取的方法
. read() 将文件中的内容全部读取出来. 弊端: 占内存.如果文件过大,容易导致内存崩溃 . read(n) 默认:读去文件内容全部read(n) 读取n个字符. readline() 一次读取一行数据 , 注意每次读出来的数据都会有一个\n 需要使用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,852,苹果,2,6要想获得这些数据f = open("水果.txt", mode="r", encoding="utf-8")lst = []for line in f: # 1,香蕉,1.85,50 dic = {} # 每行都是一个字典 line = line.strip() # 去掉空白 \n 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() # 去掉空白 \n 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 = 0for line in f: # 1,香蕉,1.85,50 dic = {} # 每行都是一个字典 line = line.strip() # 去掉空白 \n 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)