python文件操作
文件操作流程
1.打开文件,得到文件句柄并赋值给一个变量,
2.通过句柄对文件进行操作,
3.关闭文件。
例如现有一个文件内容如下:
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
f = open('小重山') #打开文件 data=f.read()#获取文件内容 f.close() #关闭文件
注意:文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open('hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。
文件打开模式
文件具体操作
f.read()读取文件内容,读的时候从光标的位置开始读,
f.read(5)读取5个字符,在2.x版本里读5个字节。
f.readline读出一行内容包括换行符。
f.readlines读出所有行放到一个列表中,每一行包括换行符。
例子:打印所有行,另外第3行后面加上:'end 3',
count=0 for line in f:#这是迭代方法,每次只读一行,节省内存 if count==3: line=''.join([line.strip(),'end 3']) print(line.strip()) count+=1
f.flush(写操作并不会立即写到磁盘,而是存到缓存区最后才是存)
f.write(),f.flush(),内容会立即写到磁盘上。
f.seek()调整光标的位置,按字节计算的。可以包含两个参数,第二个参数可以是0,1,2,0代表从最开始计算移动,1表示从当前位置开始移动,2表示从最后开始移动。
例如:f.seek(-3,2)就是从最后开始计算光标往前移3个字节。模式二必须在bytes的模式才能使用,r模式不能操作。
f.tell()打印光标位置。
进度条:
import sys,sys.stdout就是标准输出的文件句柄,可进行读写操作,
import sys sys.stdout.write("hello") 输出结果: hello
print函数就是stdout实现的。
import sys for i in range(100): s="\r%d%% %s"%(i,"#"*i) sys.stdout.write(s) sys.stdout.flush() import time time.sleep(0.5)
seek可完成断点续传。
with open() as f:获得文件句柄,为了避免打开文件后忘记关闭,可以通过这种方式获得文件句柄。当with代码块执行完毕时,内部会自动关闭并释放文件资源。with支持同时对多个文件的上下文进行管理。
with open('log1') as obj1, open('log2') as obj2: pass
练习取出网址中的server打印出来:
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.oldboy1.org server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33 server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000 server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000 backend www.oldboy2.org server 3.3.3.3 3.3.3.3 weight 20 maxconn 3000 backend www.oldboy20.org server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33
while 1: m=input('please input url:').strip() l=[] flag=False with open("haproxy.conf",encoding="utf8") as f_read: for line in f_read: if line.startswith("backend") and m in line: #第一步:信息匹配 flag=True # 设定一个开关 continue if line.startswith("backend") and flag: # 第三部:跳出循环 break if flag: # 第二步:将信息存放到列表 #[] l.append(line.strip()) for i in l: print(i)
文件修改:
文件修改的思路就是创建一个新的文件,遍历原文件修改要改的东西存到另一个新的文件,文件名称交换。
import os with open("test",encoding="utf8") as f_read,open("test7",encoding="utf8",mode="w") as f_write: count=0 for line in f_read: if count==3: line="".join([line.strip(),"岳飞\n"]) f_write.write(line) count+=1 os.rename("test", "test_bak") os.rename("test7","test")