Python 文件操作的详解及实例
Python文件操作的详解及实例
一、文件操作
1、对文件操作流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
现有文件如下:
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
f=open('小重山')#打开文件
data=f.read()#获取文件内容
f.close()#关闭文件
注意:ifinthewin,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open(‘hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。
2、文件打开模式
CharacterMeaning
'r'openforreading(default) 'w'openforwriting,truncatingthefilefirst 'x'createanewfileandopenitforwriting 'a'openforwriting,appendingtotheendofthefileifitexists 'b'binarymode 't'textmode(default) '+'openadiskfileforupdating(readingandwriting) 'U'universalnewlinemode(deprecated)
先介绍三种最基本的模式:
#f=open('小重山2','w')#打开文件
#f=open('小重山2','a')#打开文件
#f.write('莫等闲1\n')
#f.write('白了少年头2\n')
#f.write('空悲切!3')
3、文件具体操作
f=open('小重山')#打开文件
#data1=f.read()#获取文件内容
#data2=f.read()#获取文件内容
#
#print(data1)
#print('...',data2)
#data=f.read(5)#获取文件内容
#data=f.readline()
#data=f.readline()
#print(f.__iter__().__next__())
#foriinrange(5):
#print(f.readline())
#data=f.readlines()
#forlineinf.readlines():
#print(line)
#问题来了:打印所有行,另外第3行后面加上:'end3'
#forindex,lineinenumerate(f.readlines()):
#ifindex==2:
#line=''.join([line.strip(),'end3'])
#print(line.strip())
#切记:以后我们一定都用下面这种
#count=0
#forlineinf:
#ifcount==3:
#line=''.join([line.strip(),'end3'])
#print(line.strip())
#count+=1
#print(f.tell())
#print(f.readline())
#print(f.tell())#tell对于英文字符就是占一个,中文字符占三个,区分与read()的不同.
#print(f.read(5))#一个中文占三个字符
#print(f.tell())
#f.seek(0)
#print(f.read(6))#read后不管是中文字符还是英文字符,都统一算一个单位,read(6),此刻就读了6个中文字符
#terminal上操作:
f=open('小重山2','w')
#f.write('hello\n')
#f.flush()
#f.write('world')
#应用:进度条
#importtime,sys
#foriinrange(30):
#sys.stdout.write("*")
##sys.stdout.flush()
#time.sleep(0.1)
#f=open('小重山2','w')
#f.truncate()#全部截断
#f.truncate(5)#全部截断
#print(f.isatty())
#print(f.seekable())
#print(f.readable())
f.close()#关闭文件
接下来我们继续扩展文件模式:
#f=open('小重山2','w')#打开文件
#f=open('小重山2','a')#打开文件
#f.write('莫等闲1\n')
#f.write('白了少年头2\n')
#f.write('空悲切!3')
#f.close()
#r+,w+模式
#f=open('小重山2','r+')#以读写模式打开文件
#print(f.read(5))#可读
#f.write('hello')
#print('------')
#print(f.read())
#f=open('小重山2','w+')#以写读模式打开文件
#print(f.read(5))#什么都没有,因为先格式化了文本
#f.write('helloalex')
#print(f.read())#还是read不到
#f.seek(0)
#print(f.read())
#w+与a+的区别在于是否在开始覆盖整个文件
#ok,重点来了,我要给文本第三行后面加一行内容:'hello岳飞!'
#有同学说,前面不是做过修改了吗?大哥,刚才是修改内容后print,现在是对文件进行修改!!!
#f=open('小重山2','r+')#以写读模式打开文件
#f.readline()
#f.readline()
#f.readline()
#print(f.tell())
#f.write('hello岳飞')
#f.close()
#和想的不一样,不管事!那涉及到文件修改怎么办呢?
#f_read=open('小重山','r')#以写读模式打开文件
#f_write=open('小重山_back','w')#以写读模式打开文件
#count=0
#forlineinf_read:
#ifcount==3:
#f_write.write('hello,岳飞\n')
#
#else:
#f_write.write(line)
#anotherway:
#ifcount==3:
#
#line='hello,岳飞2\n'
#f_write.write(line)
#count+=1
##二进制模式
#f=open('小重山2','wb')#以二进制的形式读文件
##f=open('小重山2','wb')#以二进制的形式写文件
#f.write('helloalvin!'.encode())#b'helloalvin!'就是一个二进制格式的数据,只是为了观看,没有显示成010101的形式
注意1:无论是py2还是py3,在r+模式下都可以等量字节替换,但没有任何意义的!
注意2:有同学在这里会用readlines得到内容列表,再通过索引对相应内容进行修改,最后将列表重新写会该文件。
这种思路有一个很大的问题,数据若很大,你的内存会受不了的,而我们的方式则可以通过迭代器来优化这个过程。
补充:rb模式以及seek
在py2中:
#昨夜寒蛩不住鸣.
f=open('test','r',)#以写读模式打开文件
f.read(3)
#f.seek(3)
#printf.read(3)#夜
#f.seek(3,1)
#printf.read(3)#寒
#f.seek(-4,2)
#printf.read(3)#鸣
在py3中:
#test:
昨夜寒蛩不住鸣.
f=open('test','rb',)#以写读模式打开文件
f.read(3)
#f.seek(3)
#print(f.read(3))#b'\xe5\xa4\x9c'
#f.seek(3,1)
#print(f.read(3))#b'\xe5\xaf\x92'
#f.seek(-4,2)
#print(f.read(3))#b'\xe9\xb8\xa3'
#总结:在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的
#unicode数据;但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode
#直接传送bytes就好了,所以这个时候用rb模式.
#在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,
#但在py3里你就必须声明好了f的类型是rb,不允许再模糊.
#建议:以后再读写文件的时候直接用rb模式,需要decode的时候仔显示地去解码.
4、with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
withopen('log','r')asf:
pass
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python2.7后,with又支持同时对多个文件的上下文进行管理,即:
withopen('log1')asobj1,open('log2')asobj2:
pass2
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!