Python学习之文件13

文件操作

文件操作的流程

1. 建立文件对象:
2. 文件操作(读或者写)
3. 关闭文件

文件读操作

f = open('小重山','r',encoding = 'utf8')  
'''获得文件对象,小重山为当前目录下的一个文件
'r'代表为读'''
data = f.read()    #对文件进行读操作,读的内容放在data中
                   #f.read(5)  读取5个字符
print(data)
f.close()        #关闭文件
昨夜寒蛩不住鸣,
惊回千里梦,已三更。
起来独自绕阶行,
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程,
欲将心事付瑶琴,
知音少,弦断有谁听。

文件写操作

f = open('小重山','w')    #没有这个文件则创建这个文件
				    #在创建对象时会将文件的内容清空 

'''写状态下不可读   f.read()  错误'''

f.write("hello world")  #之前文件里面的内容已经全部被清空
f.write('alex')  #之前写的hello world还在,之间无空格和换行
f.close()   
'''打开一个文件就得关掉,否则不安全(虽然python在程序执行结束时会自动帮你关掉)'''
hello worldalex
#如果写的时候不希望清空文件里面的内容
f = open('小重山','a')  #该打开文件的方式为追加模式,a = append
f.write('hello')       #向文件的最后面写入hello
f.close()
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
hello


文件是立即写到磁盘(文件)里面去的吗?

观察下面的程序:

import time

f = open('小重山','a')
f.write('hello')
time.sleep(30)
f.close()

发现hello并没有立即写入文件,而是程序结束(过了30s)才写入文件的,那么在这30s'hello'放在哪里?

其实'hello'在这30s内放在缓冲区,等到程序执行到f.close()这个命令,程序才把'hello'写入磁盘,由于有time.sleep(30)这个命令,程序过了30s才执行f.close(),所以程序并没有立马把东西直接写入文件。

那么为什么不直接写入文件,而是放在缓冲区。原因就是磁盘很慢,想必大家都有体会,你打开一个大型软件会花很长的时间,想象一下,如果你进行大量文件操作时,计算机直接写入文件是很慢的,所以计算机先把东西放在缓冲区也就是在内存中,等到执行到f.close()命令在直接放入文件中。


文件操作的具体方法

readlinereadlines方法

readline()一次读取一行
readlines()直接读取所有行,形成一个列表,列表的一个元素为一行的内容

f = open('小重山','r')

data = f.readline()  #读取第一行的内容
print(data)
data = f.readline()  #读取第二行的内容
print(data)
data = f.readlines()  #读取所有行,得到一个列表,每个元素为每一行的内容
print(data)
昨夜寒蛩不住鸣。

惊回千里梦,已三更。

['起来独自绕阶行。\n', '人悄悄,帘外月胧明。\n', '白首为功名,旧山松竹老,阻归程。\n', '欲将心事付瑶琴。\n', '知音少,弦断有谁听。\n', 'hello']

tell()seek()方法

tell()是获取文件指针的位置
seek()是设置文件指针的位置

f.read(4)  
print(f.tell())  #tell已经读到哪里,默认从0开始,一个英文字符+1,中文+3,因为是utf-8编码

f.seek(0)   #设置从哪里开始读,0为从头开始读

flush()方法

flush()方法是将缓冲区里面的内容立即写入文件

f = open('小重山','r')
f.write('hello')  #不会立即写入文件,而是放入缓冲区,等到close()之后写入文件
f.flush()         #将缓冲区里面的内容写入文件,所以不需等到执行close()即可将hello写入文件
f.close()

其他打开文件的模式

之前介绍了3中打开文件的模式 ,'r':读、'w':写和'a':添加
下面介绍另外三种模式,是上面三种的进阶版:'r+'、'w+'、'a+'

r+

此模式为读写模式,既可读又可写,具体应用见下:

f = open('小重山','r+',encoding='utf8')
print(f.readline())  #读功能几乎相同,读取第一行
output:
昨夜寒蛩不住鸣。
f.write('haha')  #向文件里面写入haha,此时会在文件的最后写入haha

此时文件里面的内容为:

昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。haha

可以使用seek()方法改变文件读取和写入的位置,如:

f = open('小重山','r+',encoding='utf8')
f.seek(0)              #文件指针指向文件的开头
f.write('helloa')      #写入文件helloa,因为一个中文在utf-8编码下为三个字符,所以前2个字被替换成了helloa
f.seek(12)             #文件指向12,即第五个字
print(f.readline())    #读取并打印自12这个位置以后这一行的内容
f.close()
此时文件变为:
helloa寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。

而打印输出为:
不住鸣。


w+

此模式也可读可写,与w模式一样,在打开文件时会自动的将文件里面所包含的内容自动的删除

f = open('小重山','w+',encoding='utf8')
f.readline()     #此时读入的为空行,因为此时文件为空
f.write('hello') #向文件中写入hello
f.readline()     #此时读入的还是空行,因为此时文件的指针指向文件的最末尾
f.close()
此时文件内容已变为:
hello

打印输出为(因为什么都没有读到,所以为空):

同样可以使用seek()方法,同上


a+

此模式为添加,并且可读,添加只能在尾部添加,不能随seek()方法而改变,但是读受到seek()方法的影响。

f = open('小重山','a+',encoding='utf8')
f.seek(3)          #写是在最后写,但是这时读应该从第二个开始读
f.write('hello')   #此时是在末尾添加
print(f.readline())#读取第一行
f.close()
此时文件内容为(写到最末尾):
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听hello

输出(从第二个开始读):
夜寒蛩不住鸣。

with

with是为了防止忘了关闭文件对象而设置的,具体使用方法如下:

with open('小重山','r',encoding='utf8') as f:
    '''在这里可以进行文件的操作'''

#退出with代码块后,会自动的将文件f关闭,所以不需要手动使用f.close()方法

with打开多个文件的用法:

with open('小重山','r',encoding='utf8') as f1, open('小重山2','w',encoding='utf8') as f2:
    '''文件操作'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值