文件操作
文件操作的流程
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()
命令在直接放入文件中。
文件操作的具体方法
readline
和readlines
方法
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:
'''文件操作'''