day 08 文件操作
文件操作
1.文件操作
格式 :
open 打开
f = open(文件路径, mode="模式", encoding="编码格式") 最最底层操作的就是bytes
文件句柄是一个可迭代对象
优点:
相对来说节省内存, 操作相对简单
for line in f: # 从文件中读取到每一行给前面的line print(line.strip()) f.close()
绝对路径:
从磁盘根目录开始寻找
f = open("E:\西游记\金角大王吧.txt", mode="r", encoding="gbk") print(f.read()) f.close()
相对路径:
相对于当前程序所在的文件夹 ../ 上一层文件 文件夹/ 进入xxx文件夹
r: read 只读 f = open("alex和wusir的故事", mode="r", encoding="utf-8") 读取内容 content = f.read() # 全部都读取出来 print(content) 坑: c2 = f.read() # 读取不到内容. 因为上面已经读取完毕. 光标在末尾 print("c2", c2) 良好的习惯 f.close() # 关闭连接
读写文件时的良好习惯:
f1.close() 2.flush() f2.close()
2.mode
1. read()
默认: 读取文件内容(全部)
read(n) 读取n个字符
2. readline() 读取一行
3. readlines() 读取全部. 返回列表
r: 读取,只读.
读取文件的相关操作
w:
写入. 只写
创建文件
会清空文件
a:
也可以创建文件
追加写
r+: 对于文件而言. 应该有的操作就两个:读, 写
读写操作
w+:
写读操作
a+:
追加写读
所有带b的表示直接操作的是bytes, 当处理非文本文件的时候.
rb
wb
ab: 断点续传
r+b
w+b
a+b
3. 文件操作中关于文件句柄的相关操作
seek() 移动光标
tell
返回光标所在的位置(返回的位置是以字节的形式)
truncate() 截断内容
f.seek(0) 移动到开头(最多)
f.seek(0, 2) 移动到末尾
f = open("胡辣汤", mode="r+", encoding="utf-8") f.seek(0,2) # 移动到末尾 content = f.read(5) print(content) f.seek(0) # 移动到开头 print(f.read()) print(f.tell()) # 字节 f.seek(3) print(f.read())
seek:
根据字节数来判断位置
1. 表示偏移量
2. 从xxx开始偏移, 默认0, 开头 1 当前位置, 2 末尾
f.flush() 刷新管道把数据写入文件
f.close() 在对文件读取或者写入操作完毕时关闭文件
4. 文件修改, 实际操作
mode "r"
f = open("小护士模特主妇萝莉.txt", mode="r", encoding="utf-8") print(f.read(5)) # 读取5个字符 print(f.read(5)) # 继续读5个 print(f.readline().strip()) # 换行符为分割, strip()可以去掉换行. 读取到的内容第一件事就是去掉空白 print(f.readline()) # 换行符为分割
f.close()
mode "w"
每次用w模式打开文件, 都会清空这个文件(坑)
f = open('胡辣汤', mode="w", encoding="utf-8") # 可以帮我们创建文件 f.write('河南特色\n') f.write("东北特色\n") f.write('陕西特色\n') # 好习惯 f.flush() # 刷新管道, 把数据写入文件 f.close()
mode "a"
a, append 追加, 在文件的末尾写入内容(保留前面的内容,如果没有文件默认创建)
f = open("葫芦小金刚", mode="a", encoding="utf-8") # a, append 追加, 在文件的末尾写入内容 f.write("你叫什么名字啊?") f.read() # not readable f.flush() f.close()
mode "r+"
f = open("葫芦小金刚", mode="r+", encoding="utf-8") content = f.read(2) # 顺序必须先读, 后写 # r+特有的深坑:不论读取内容的多少. 只要你读了. 写就是在末尾 f.write('五娃') print(content)
mode "w+"
一上来会清空文件,没人会用
f = open("葫芦小金刚", mode="w+", encoding="utf-8") content = f.read(2) # 顺序必须先读, 后写 # # r+特有的深坑:不论读取内容的多少. 只要你读了. 写就是在末尾 f.write('五娃') f.write("又能吐火的, 有能吐水的.") # 移动光标 f.seek(0) # 移动到开头 s = f.read() print("=========>", s)
mode "a+"
追加写读, 光标在末尾. 所有的写都是在末尾
f = open("葫芦小金刚", mode="a+", encoding="utf-8") f.write("机器葫芦娃召唤神龙, 高喊.我代表月亮消灭你!") f.seek(0) s = f.read() print("=========>", s)
例1: ↓
文件复制
f1 = open("c:/huyifei.jpg", mode="rb") f2 = open("d:/huerfei.jpg", mode="wb") for line in f1: # line是从f1中读取的内容 f2.write(line) # 把读取的内容原封不动的写出去 f1.close() f2.flush() f2.close()
例2: ↓
替换
需求: 把好人换成sb
必须:
1. 先从文件中读取内容
2. 把要修改的内容进行修改
3. 把修改好的内容写人一个新文件
4. 删除掉原来的文件
5. 把新文件重命名成原来的文件的名字
# 导入os模块 os表示操作系统 import os 写法1 f = open("夸一夸alex", mode="r", encoding="utf-8") f2 = open("夸一夸alex_副本", mode="w", encoding="utf-8") 写法2 # with会自动的帮我们关闭文件的链接 with open("夸一夸alex", mode="r", encoding="utf-8") as f, \ open("夸一夸alex_副本", 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("夸一夸alex") # 重命名副本为原来的文件名 os.rename("夸一夸alex_副本", "夸一夸alex")
例3: ↓
水果统计
1.
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)
模板: 水果.txt
1,香蕉,1.85,50
2,苹果,2.6,100
3,榴莲,25,800
4,木瓜,3.5,10000
2.
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)
模板:水果.txt
编号,名称,价格,数量
1,香蕉,1.85,50
2,苹果,2.6,100
3,榴莲,25,800
4,木瓜,3.5,10000
3.动态添加
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() # 去掉空白 \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)
模板:水果.txt
编号,名称,价格,数量,哈哈
1,香蕉,1.85,50,60
2,苹果,2.6,100,70
3,榴莲,25,800,80
4,木瓜,3.5,10000,90