一、初识文件操作
使用python来读写文件是非常简单的操作,通常使用open函数打开一个文件,获取文件句柄。通过文件句柄可以进行各种操作,而根据打开文件模式的不同导致文件允许的操作也存在差异.
二、文本文件与二进制文件
文本文件和二进制文件只是文件的不同展示方式。
(1)本质上来看,所有文件都是二进制方式存储;
(2)文本文件是由单一特定编码组成的文件,例如utf-8编码;适用于例如.txt文件、.py文件;
(3)二进制文件由比特0和1组成,没有统一字符编码;适用于例如.png文件、.avi文件等;
三、打开文件模式
打开文件模式有:
(1)读模式(r,rb),以只读模式打开文件,文件指针放在文件开头,文件不存在则报错,系统默认以读模式打开文件;
(2)写模式(w,wb),打开一个文件只进行写入,不能进行读操作,原文件存在则覆盖原文件,文件不存在则新建文件;
(3)追加模式(a,ab),在原有文件上进行修改,也不能进行读操作;如果原文件存在,则文件指针放在文件结尾,文件不存在则新建文件。
(4)‘+’模式,与r/w/a同时使用,在原有基础上增加读写功能
备注:如果以二进制模式打开文件,需要在在原有模式下增加‘b’,通常用于图片或视频文件;
对于非二进制文件的读写操作,需要设置编码集,通常用utf-8;对于二进制文件,读取出来的数据是bytes类型, 在rb模式下.不能选择encoding字符集.
四、文件内容的读取
(1)f.read(size=-1):读入全部内容,如果给出参数,读入前size长度
(2)f.readline(size=-1):读入一行内容,如果给出参数,读入该行前size长度
(3)f.readlines(hint=-1):读入文件所有行,以每行为元素形成列表,如果给出参数,读入前hint行
(4)f.write(s):向文件写入一个字符串或字节流
(5)f.writelines(lines):将一个元素全为字符串的列表写入文件
(6)f.seek(offset):改变当前文件操作指针的位置,offset含义如下:0 – 文件开头; 1 – 当前位置; 2 – 文件结尾
五、文件的逐行操作
(1)一次读入,分行处理。文件较大时影响性能,易引起内存泄漏
f = open('yesterday',encoding='utf-8')#文件句柄
for index,line in enumerate(f.readlines()):
if(index == 9):
print("-------------分割线--------------")
continue;
print(line.strip())
(2)分行读入,逐行处理,效率高,不会造成内存泄漏
f = open('yesterday',encoding='utf-8')#文件句柄
count = 0
for line in f:
count+=1
if(count == 10):
print("-------------分割线--------------")
continue;
print(line.strip())
六、其他相关操作
(1)tell()获取光标在文件的位置
f = open('yesterday',encoding='utf-8')#文件句柄
print(f.tell())
print(f.read(4))
print(f.tell())
(2)seek(offset[,from])方法用于移动文件读取指针到指定位置。offset参数表示要移动的字节数,参数指定要移动字节的引用位置。from为0表示文件开头,1表示当前位置,2表示文件结尾作为参考位置
f = open('yesterday',encoding='utf-8')#文件句柄
print(f.tell())
print(f.readline())
print(f.tell())
f.seek(0) #回到文件开头
print(f.readline())
(3)seekable()判断光标能否在文件中移动,例如终端文件的光标不可移动;flush()是用于强制刷新,把缓存中的数据强制实时刷新到硬盘中
(4)truncate([size]) 方法用于截断文件并返回截断的字节长度。指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。
七、文件修改
1.简单粗暴直接修改
(1)打开文件,获取文件内容;
(2)对内容进行修改;
(3)清空原来文件的内容;
(4)把新的内容写进去。
fw = open('username','a+',encoding='utf-8')
new_status = ''
fw.seek(0)
for s in fw:
stu = 'A班_'+s
new_status = new_status + stu #读文件并修改
fw.seek(0)
fw.truncate()
fw.write(new_status)
fw.flush()
fw.close()
2.备份文件的方法
当文件很大时,刚刚的方法在一次性读取文件内容和写入新内容时,耗时长,占用磁盘空间也较大。
备份文件的方法可以建立一个备份文件,修改一行写一行,具体步骤如下:
(1)打开2个文件,原文件a和备份文件b。如a.txt b.txt.bak
(2)删除a文件,将b文件名改为a文件名
import os
with open('username',encoding='utf-8') as fr,open('username.bak','w',encoding='utf-8') as fw :
for line in fr:
newline = line.replace('7','seven')
fw.write(newline)
os.remove('username')
os.rename('username.bak','username')