一、文件操作基本用法
1、
open 表示打开一个文件
f 变量,操控 hehe.txt文件句柄
f = open("hehe.txt", mode="r" ,encoding="utf-8")
#读取文件中的内容
# read(n) 读取n个字符
content = f.read(3) #读取三个字符
content = f.read() #一次性全部读取出来
line = f.readline() # 读取一行数据
print(line.strip()) # strip() 去掉空白。空格
lst = f.readlines() # 一次性全部读取出来,返回的是列表
print(lst)
2、路径问题
两种:
a 、 绝对路径(当文件路径是固定的时候)
从磁盘根目录找文件。 windows 下用的就是 c,d,e,f linux: /user/bin/xxx
b、相对路径(用的多)
相对路径相当于当前程序所在的文件夹
../ 表示上一层文件夹
3、注意事项:
1)、 等转义字符。有固定含义的,出现在路径中就会造成麻烦,可多加 .。推荐使用r
f = open(r"E:哈哈 hehe.txt",mode="r", encoding="utf-8") # 路径前面加上 r ,意为禁止路径中的转义
print(f.read())
2)、f = open("hehe", mode="r", encoding="utf-8")
#正常情况下不能用
f.read()
f.readlines() # 直接用容易造成内存溢出
3)、必须要掌握的
文件句柄是一个可迭代对象
f = open("hehe", mode="r", encoding="utf-8")
for line in f: # 读取文件中的内容。一行一行的读取, 每次读取的内容交给变量 line
print(line.strip())
4)、 r :只读
w:只写,注意open打开时会清空文件,文件不存在时会创建文件
a:append 在文件尾部追加内容,文件不存在时同样可以创建文件
二、 文件操作之 w a
1、 mode="w" # 假如文件不存在时,w可以帮我们创建文件
f = open("taibai", mode="w", encoding="utf-8")
f.write("太白 ")
f.write("很白 ")
f.write("特别白 ")
f.close()
2、f = open("taihei", mode="a", encoding="utf-8")
f.write("太黑了 ")
f.write("很黑 ")
f.write("特别黑 ")
f.close()
3、文本文件的赋值
f1 = open(r"c:日记本.txt", mode="r", encoding="utf-8")
f2 = open(r"d日记本.txt", mode="w", encoding="utf-8")
for line in f1: # 从f1中读取数据
f2.write(line) # 写入到 f2 中
f1.close()
f2.close()
三、文件操作之 b
b - bytes 读取和写入的是字节,用来操作非文本文件(图片,音频,视频)
rb wb ab
# 需要掌握的:
# 把胡一菲.jpg 从c盘复制到d盘,单纯的的从bytes 角度来复制的。适用于所有的文件
f1 = open(r"c:胡一菲.jpg", mode="rb")
f2 = open(r"d:胡二菲,jpg", mode="wb")
for line in f1: # 分批量的读取内容
f2.write(line) #open() 出来的结果可以使用read或者write。
f1.close()
f2.close()
四、文件操作之 +
r+ :读写, w+:写读, a+ :追加写读, r+b, w+b , a+b
1、r+
# 正常点的,可用的-------先读取内容,后光标跳到最后再写
f = open("person", mode="r+", encoding="utf-8")
content = f.read()
f.write("黄蓉")
print(content)
# 错误的示范
f = open("person", mode="r+", encoding="utf-8")
f.write("杨千嬅") #默认直接写入的话,是从开头写入。 覆盖开头的内容
content = f.read()
print(content)
# 坑 : 不论你读取多少内容。再次写入的时候都是在末尾(手动调光标可选定写入位置)
f = open("person", mode="r+", encoding="utf-8")
info = f.read(3)
f.write("辣眼睛")
print(info)
2、w+
f = open("person", mode="w+", encoding = "utf-8") # 先清空然后再操作
f.write("你好,我叫巫妖王")
content = f.read() # 写入东西后,光标在末尾,读取不到内容
print(content)
f.close()
3、a+ , #不论光标在何处,写入的时候都是在末尾
f = open("person", mode="a+",encoding="utf-8")
f.write("我叫李嘉诚") # 默认写在末尾
综上: r+ 、w+ 、a+ 都是后坑的地方,切记少用,注意神坑
五、光标
1、seek() 小试
# 文本信息: 李雷是大烧饼
f.seek(3) # 以字节为单位----移动三个字节
f.read(3) # 以字符为单位,读取三个字符
结果: 雷是大
2、seek() 的应用
seek(参数1, 参数2)
参数1:表示是偏移量,移动多少个字节单位
参数2: 表示从什么位置进行偏移(0:开头 1:当前位置 2:末尾)
# 把光标移动到文件开头:seek(0) #参数2 不写默认为0
# 把光标移动到末尾: seek(0,2)
print(f.read(2)) # 读取两个字符
f.seek(0) # 回到开头
print(f.read(2)) # 读取两个字符
3、tell() # 返回当前光标位置
info = f.read(3)
print(info)
print(f.tell()) # 获取光标位置
4、truncate() 截断文件。慎用
六、文件修改
# 将文件中的"善良" 改为"sb"
import os # 导入os模块
import time # 导入时间模块
# with 语句的优点,自动关闭连接
with open("唐诗", mode="r", encoding="utf-8") as f1,
open("唐诗_副本",mode="w", encoding="utf-8") as f2:
for line in f1:
line = line.replace("善良","sb")
f2.write(line)
time.sleep(5)
os.remove("唐诗") # 删除源文件
time.sleep(5)
os.rename("唐诗_副本","唐诗") # 把副本改名成源文件
七、 文件操作应用
文件内容: fruit.txt
id 水果 价格 数量
1 苹果 5 50000
2 葡萄 7 60000
......
f = open("fruit.txt" , mode="r" , encoding="utf-8")
titles = f.readline().strip() # 读取第一行,同时可以将光标移到第二行开头
title_lst = titles.split(",") # ["id","水果","价格","数量"]
lst = []
for line in f: # 光标开始从第二行读取
dic = {}
ll = line.strip().split(",")
for i in range(len(title_lst)):
dic[title_lst[i]] = ll[i]
lst.append(dic)
f.close()
print(lst)