Python之路-文件操作(py3)
文件操作的基本步骤:
1.打开文件:f=open('filename'),with open('filename') as f
2.操作文件:增,删,改,查
3.关闭文件:f.close
打开文件
python中打开文件的函数为open('filename',mode='r',encode='None'),open函数默认返回文件的句柄,我们可以根据句柄来对文件进行增,删,改,查的操作。将句柄赋给我们定义的变量,假设我们定义变量为f,则f=open('filename',mode='r',encode='utf-8') 或者with open('filename') as f。
注意点:
1.python解释器打开文件时,是对硬盘进行操作,需要内核态才可以操作硬盘,故此时python解释器是调用操作系统的文件读取接口。windows中文版本默认使用GBK编码表,linux默认使用utf-8,所有如果操作的文件在windows下,非GBK编码的,需要在open函数中声明编码类型,使操作系统运用相应的编码规则进行解码读取,防止串码,乱码现象。
2.open主要有三种模式,读(r),写(w),追加(a),其中,默认为读模式。各个模式的详解,见下文。
关闭文件
关闭文件有两组方式:1.使用f.close() ,f为open返回的句柄赋值的变量名。 2.程序结束后,自动关闭。第二个方法容易造成文件写操作时,数据的丢失。原因是写数据时,数据会先保存在内存中,文件关闭时才会写入硬盘,此时如果文件未关闭,软件因为异常崩溃,导致内存中的数据丢失,且未写入硬盘中。作为第二种关闭方法的优化,是使用:with open('filename') as f 。with会创建一个程序块,将文件操作置于with程序块下,这样with控制块结束,文件也会自动关闭。
文件操作
查(文件已读模式打开,或者w+,a+模式):
f.read():读取文件内容,默认为读取全部(返回字符串类型),可在括号内指定读取的字节(py2)或字符数(py3)。在windows下,读取非GBK格式文件,需要加编码参数encoding。
f.readline():一行一行的读取文件内容。
f.readlines():读取文件的全部内容,以列表的形式返回。一行为列表中的一个元素。
f:以迭代的方式读取文件,优化了内存使用。
f.seek():移动光标位置,f.seek(offset[, whence]),whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。whence为1或者2时,文件需要以bytes的方式打开,且定义的位移单位为字节。
f.tell():返回当前光标所在的位置
增:
f.write():写数据进文件
f.flush():将内存中的数据刷新到硬盘上
改,删:
由于文件在磁盘中的存储都是固定的扇区,如果要对文件进行更改,只能再新建一个文件,进行修改和删除的操作。
文件打开模式
r+,w+,a+模式:
r为只读模式,以该模式打开文件,则只能进行读操作,不能写。r+则是读写模式,先读取文件内容,后写入新的内容,所以使用该模式修改文件,则修改的内容会添加到文件的末尾。
w为写模式,w会覆盖掉原先的文本内容,重新写入数据。w+为写读模式,先写后读。所以需要先写数据后,利用seek移动光标位置再读取数据 。w+的特性也导致了文件内容会被覆盖。
a为追加写模式,会将内容追加到文件模式。a+是先追加后读,所以加的内容会在文件末尾,读取文件时也需要用seek来移动光标位置再读取。
示例:
下面会文件内容
global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms option dontlognull listen stats :8888 stats enable stats uri /admin stats auth admin:1234 frontend oldboy.org bind 0.0.0.0:80 option httplog option httpclose option forwardfor log global acl www hdr_reg(host) -i www.oldboy.org use_backend www.oldboy.org if www backend www.oldboy.org server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 backend www.oldboy2.org server 100.1.7.10 100.1.7.9 weight 20 maxconn 3000 server 100.1.7.11 100.1.7.9 weight 20 maxconn 300 server 100.1.7.12 100.1.7.9 weight 20 maxconn 300 backend www.oldboy3.org server 100.1.3.9 100.1.7.9 weight 20 maxconn 3000 server 100.1.3.10 100.1.7.9 weight 20 maxconn 300
对文件进行读操作,输入域名,查询域名下的对应配置内容
flag=False contain_list=[] domain=input("请输入域名:").strip() with open('haproxy.conf') as f: for line in f: if line.startswith('backend') and line.count(domain): flag=True continue elif line.startswith('backend') and flag: flag=False elif flag: contain_list.append(line.strip()) for i in contain_list: print(i)