读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。
读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
一、文件操作流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件(用with语法可免)
二、常规操作
f = open('file', 'r',encoding='utf-8') //打开文件,得到文件句柄赋值给一个变量
f.read() //调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,class type:str
f.close() //调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
for i in f.readlines(): //readlines方法返回的是list,用python跌代器特性也可遍历全文
print(i)
read()
<b>调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
读取总结:如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便
三、open的打开模式
打开文件的模式有:
r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】
w+,写读
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)rb
wb
ab
四、with语句
文件读写结束后务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。使用with语句,可避免这样的错误
with open('file','w',encoding='utf-8') as f:
f.write('hello world')
五、examples
Tips:python修改文件时,使用w模式会将原本的文件清空/覆盖。可以先用读(r)的方式打开,写到内存中,然后再用写(w)的方式打开。
需求:实现sed简单替换功能
- 定义一个函数,带有4个参数
- x 表示要更新的文件名称
- y 表示要被替换的内容
- z 表示 替换后的内容
- s 默认参数为 1 表示只替换第一个匹配到的字符串
- 如果参数为 s = 'g' 则表示全文替换
def file(x,y,z,s=1):
with open(x,'r',encoding='utf-8') as f:
lines = f.readlines()
with open(x,'w',encoding='utf-8') as fw:
n = 0
if s == 1:
for i in lines:
if y in i:
i = i.replace(y,z)
n+=1
break
fw.write(i)
n+=1
for i in range(n,len(lines)):
fw.write(lines[i])
elif s == 'g':
for i in lines:
if y in i :
i = i.replace(y,z)
fw.write(i)
file('文件名','原字符','被替换字符')
六、替换文件的两种方法
python修改文件时,使用w模式会将原本的文件清空/覆盖。可以先用读(r)的方式打开,写到内存中,然后再用写(w)的方式打开。
(1)把文件写进内存之后在修改
with open('file',encoding='utf-8') as f:
lines = f.readlines //写进内存
with open('file','w',encoding='utf-8') as fw:
pass #将上方lines变量(把文件存储到内存中),写进原文件
(2)读取原文件并将新内容写在新文件中
with open('file',encoding='utf-8') as f:
with open('file_new','w',encoding='utf-8') as f_w:
for i in f.readlines():
f_w.write(i)