一、文件操作
1.tell()方法返回文件的当前位置,即文件指针当前位置。
- UTF-8 编码格式,一个中文占3个字符
- GBK 编码格式,一个中文占2个字符
#写入前文件内容如下 """ 秦时明月汉时关 万里长征人未还 但使龙城飞将在 不教胡马度阴山 """ f = open("music","r",encoding="utf8") print(f.tell()) print(f.read(5)) print(f.tell()) f.close() #打印出结果如下 """ 0 #初始指针在文件头,也就是位置为0的位置上 秦时明月汉 #打印出5个汉字 15 #此时指针位置在15 """
2.seek()指针从哪里开始写入
file.seek(offset[, whence])
-
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
- whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
#seek() 参数 whence 默认为 0 f = open("music","r",encoding="utf8") print(f.read(5)) f.seek(3) print(f.read(2)) f.close() #结果如下 """ 秦时明月汉 时明 """
#seek() 参数 whence 为 1 #文件内容如下 """ 秦时明月汉时关 """ f = open("music","rb") #读取模式需为 "rb" print(f.read(3).decode("utf8")) #读取出的内容解码为 utf8 f.seek(3,1) print(f.read(3).decode("utf8")) f.close() #结果如下 """ 秦 明 """
#seek() 参数 whence 为 2 #文件内容如下 """ 秦时明月汉时关 """ f = open("music","rb") #读取模式需为 "rb" print(f.read(3).decode("utf8")) #打印出的结果为汉字需要解码为 utf8 f.seek(-9,2) #指针改成倒数第三个汉字前进行读取 print(f.read(6).decode("utf8")) #从指针位置向后读取两个汉字 f.close() #结果如下 """ 秦 汉时 """
3.flush()
- 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
- 一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
import time f = open("music","w",encoding="utf8") f.write("hello world") #此时写入的内容在(缓冲区)缓存中,并未写入到磁盘中,需要执行后面的 f.close() 才会将内容从缓存中写入到磁盘中 f.flush() #此操作就是提前将缓冲区内的内容写入到磁盘中 time.sleep(10) f.close()
#方案一 import sys,time for i in range(30): #进度条类型 sys.stdout.write("*") #此时写入在缓冲区 sys.stdout.flush() #通过 flush() 实时刷新 time.sleep(0.2) #方案二 import time for i in range(30): #进度条类型 print("*",end="",flush=True) time.sleep(0.2)
4.truncate()
- 方法用于截断文件并返回截断的字节长度。
- 指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。
#文件内容如下 """ 秦时明月汉时关 万里长征人未还 但使龙城飞将在 不教胡马度阴山 """ #truncate()参数为空时 f = open("music","r+",encoding="utf8") f.truncate() print(f.read()) f.close() #输出结果如下 """ """ #truncate()有参数时 f = open("music","r+",encoding="utf8") f.truncate(15) print(f.read()) f.close() #输出结果如下 """ 秦时明月汉 """