Python之文件操作
操作流程:
1、打开文件
open( )
2、操作文件
read、write
3、关闭文件
close( )
文件操作:
将一些特定的内容写在一个.txt文件中。
在操作文件,其实是对文件的句柄进行操作。open打开一个文件后,要定义一个别名。也就是文件句柄。
f = open('car') #打开文件 data = f.read() #读文件操作 print(data) #打印读到的内容 f.close() #关闭文件
--------------------读( r )-----------------
read默认是读文件里的全部内容,那么如何使句柄只读取指定的部分内容哩?
f = open('car') data = f.read(5) #参数数字是指定读取的字符个数。 print(data) f.close() 从文件开头处读取
注意:Python2是按字节取,所以,如果取5个字节,第5个字节是汉字的话,是呈现乱码的。
Python3是按字符取,所以,取5个字节,都可以正常显示。
read取值是看光标指针的所在位置。
read按行取值。
f = open('car') data = f.readline() #readline是按行取文件的内容,而不是按这字符或字节。 print(data) f.close() f = open('car') data = f.readlines() #readlines是按行取文件的所有内容。是列表数据类型。 print(data) f.close() f = open('car') data = f.readable() #readable 是判断文件是不是可读文件。返回布尔值。 print(data) f.close()
在指定的行尾加内容:
#在指定行后加内容。 f = open('car') data = f.readlines() #readline是按行取文件的内容,而不是按这字符或字节。 count = 0 for line in f: # f文件句柄,在去f里面的数据时,是一行一行去,不占用多大的内存空间。 if count == 3: line = ''.join([line.strip(),'小岳岳']) #字符串拼接,在第4行,末端加小岳岳。 print(line.strip()) count+=1
f.close()
---------------写( w 覆盖写 )--------------
在仅写操作时,是不可read的。
w模式,在没有指定文件时,可以创建文件,有指定文件时,w的写入操作是覆盖原文件里的全部内容。重新写入。
f = open('test',mode='w',encoding='utf-8')
这里的encoding是编码的方式。
f.write('hello world!') # w是覆盖写
f.close()
a模式( 追加写 ):是追加写操作。这个a模式不会覆盖文件里原有的数据。
数据会在光标指针所在的后面进行追加操作。
在运维中,a的模式适用于写日志。追加写入。
flush模式:数据不在内存中等待,直接写到硬盘上。
f = open('test1234',mode = 'w',encoding = 'utf-8')
f.write("hellp test1234")
f.flush()
f.close()
writelines( [ '11111 ','22222 ' ] ) 想当于每行去写入,可写多行。
f.truncate( 3 ) 截断,参数3的意思是,在光标位,开始截断,截三的字节。
进度条实现:
import sys,time for i in range(100): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.5)
进度条完善:
import sys,time for i in range(100): s = ' %d%% %s'%(i,'#'*i) sys.stdout.write(s) sys.stdout.flush() time.sleep(0.5)
x模式:
x模式和w都是写操作,只不过,有一点不同,就是在写的时候,如果有文件,不会覆盖,且会报错,如果没有,就和w模式一样。创建一个。
f = open('car',mode='x') data = f.write('---- hello world!') print(data) f.close()
=================读写( r+,w+,a+ )===============
r+ 操作:
默认光标在开始位置,写是追加写
# r+ f = open('car',mode='r+',encoding='utf-8') print(f.read()) f.write("george ") print(f) f.close()
w+操作:
覆盖写,想读的话,用seek调整光标位置。
# w+ 首先是写,再是读, f = open('car',mode='w+',encoding='utf-8') print(f.read()) f.write('helloadfafas') # seek,可以指定光标的位置。 seek是按字节移动的。 f.seek(7) # 将光标移到开始位置。 print(f.tell()) #打印光标所在位置 print(f.read())
注意点:
seek:是可以指定光标位置的,seek是按字节移到位置的。
seek( 7,0或1或2 ),参数数字7是光标的移到位移长度,光标是在文件内容开头开始移到。
参数0或1或2的意思是:
0:为光标在开头起始位置。
1:为光标的当前位置。
2:为光标在内容末端开始。往回取数据。按字节bytes的模式(read的模式)
在open时,mode的定义要带b,rb,wb,ab。才可以在seek时,用1和2。
seek的应用:
#seek的应用 # 比如,断点续传。
tell:是光标所在位置
a+模式:
光标默认在文件最后位置,不管光标位置,一定是追加写。想读取内容,要用seek调整光标的位置。
a+总是在最后的位置添加
f = open('test.txt','a+') f.seek(0) print(f.read()) f.seek(0) f.write('George Wagn')
========================= b (模式) ====================
r,w,a。都是基于字符读取的。
b是基于字节读取的。
# r w a 都是基于字符的。 而b是基于字节的。rb,wb,ab f = open('test.txt','wb') #rb 反而不用encoding了,不用去编码。因为b就已经自字节了 # print(f.read()) #在写的时候,要指定编码 f.write('helel王'.encode('utf-8')) f.close()
新的文件操作写法:with
在打开一个文件时,有时候会忘记关闭。为了防止此类事情。请用with。
打开文件:
with open( 'test' ) as f: ===》 f = open('test')
f.read()
当退出with时,就关闭了对f句柄的操作。
文件操作练习:
1 global 2 log 127.0.0.1 local2 3 daemon 4 maxconn 256 5 log 127.0.0.1 local2 info 6 defaults 7 log global 8 mode http 9 timeout connect 5000ms 10 timeout client 50000ms 11 timeout server 50000ms 12 option dontlognull 13 14 listen stats :8888 15 stats enable 16 stats uri /admin 17 stats auth admin:1234 18 19 frontend oldboy.org 20 bind 0.0.0.0:80 21 option httplog 22 option httpclose 23 option forwardfor 24 log global 25 acl www hdr_reg(host) -i www.oldboy.org 26 use_backend www.oldboy.org if www 27 28 backend www.oldboy1.org 29 server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333 30 server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000 31 server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000 32 backend www.oldboy2.org 33 server 3.3.3.3 3.3.3.3 weight 20 maxconn 3000 34 backend www.oldboy20.org 35 server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333 36 37 38 39 40 41 需求: 42 43 查询功能: 44 当用户输入www.oldboy1.org用户信息后,打印对应的server信息: 45 server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333 46 server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000 47 server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000 48 49 增加功能: 50 51 当用户输入{"backend":"www.oldboy20.org","record":{"server":1111,"weight":2222,maxconn:3333}} 52 53 在www.oldboy20.org下增加一条server信息,即文件中: 54 backend www.oldboy20.org 55 server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333 56 server 11111 weight 2222 maxconn 3333 57 58 删除功能 59 当用户输入{"backend":"www.oldboy20.org","record":{"server":1111,"weight":2222,maxconn:3333}} 60 会将www.oldboy20.org下的server 11111 weight 2222 maxconn 3333删除, 61 在文件中如下: 62 backend www.oldboy20.org 63 server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333 64 65 修改功能: 66 当用户输入{"backend":"www.oldboy2.org","record":{"server":0000,"weight":0000,maxconn:0000}} 67 68 backend www.oldboy2.org 69 server 0000 weight 0000 maxconn 0000
查功能
#思路: # 先读取haproxy的内容,循环读到的每一行。 # 判断输入的要查询的内容和循环行是否一样 while True: m = input("please input url:").strip() l = [] #标准位 flag = False with open('haproxy.conf',encoding='utf-8') 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) for i in l: print(i) if m == 'q': break
增操作:
删操作:
改操作:
文件改操作:
# 打开两个文件,一个读,一个写。 # 对源文件进行遍历读操作。拿到源文件的每一行进行判断,看是不是需要修改的那一行。 # 如果不是,就将这一行写到新的文件中去。 # 如果是,就用join方法,将拼接好的新的字符串数据写到新的文件中去。 # 并且将源文件test,新命名,为test_bak,作为备份 # 新文件改名为test。 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(),"岳飞 "]) f_write.write(line) count+=1 import os os.rename("test", "test_bak") os.rename("test7","test")