文件
文件的打开方式
书接上回,关于文件的读取和写入有多种不同的方式,其中的一种方式就可以解决昨天只能清空所有的文档再写入。
frt = open(r'example.txt',encoding='utf8') #不指定mode默认值为rt,不指定encoding默认为gbk
print(frt.read())
'''
'总是学不会 真爱也有现实面'
'''
frt.close()
fwt = open(r'example.txt',encoding = 'utf8',mode = 'wt')
fwt.write('缓缓飘落的枫叶像思念')
fwt.flush()
'''
10
'''
fwt.close()
frt = open(r'example.txt',encoding='utf8')
print(frt.read())
'''
缓缓飘落的枫叶像思念
'''
frt.close()
回顾一下前提,发现write函数执行之后还是例行的把文档之前写入的所有信息都清空了,然后重新进行了写入。
那么有没有一种方法,可以在保留之前文档中的内容的同时,写入新的内容呢?
有的兄弟,有的。
那就是将open方法中的mode参数值设定为a(append),这样就可以实现在文本的基础之上追加新的内容了。
fat = open(r'example.txt',encoding = 'utf8',mode = 'at') #使用a参数打开文档
fat.write('我点燃烛火温暖岁末的秋天')
'''
12
'''
fat.close()
frt = open(r'example.txt',encoding='utf8')
print(frt.read())
frt.close()
'''
缓缓飘落的枫叶像思念我点燃烛火温暖岁末的秋天
'''
查看运行的结果,看到了并非像之前一样直接把所有的内容都清空了然后写入,而是保存旧的内容,追加了新的内容。
总的来说:mode的参数首位有r(只读),w(清空写),a(追加写),而rwa后面可以跟上的参数有t和b。
t代表txt,指文档。
b代表byte,指二进制文件。
我们使用一个例子来说明这两个参数之间的区别。
frb = open(r'example.txt',mode = 'rb') #注意:读二进制不能设置encoding值,因为没有意义
print(frb.read())
frb.close()
'''
b'\xe7\xbc\x93\xe7\xbc\x93\xe9\xa3\x98\xe8\x90\xbd\xe7\x9a\x84\xe6\x9e\xab\xe5\x8f\xb6\xe5\x83\x8f\xe6\x80\x9d\xe5\xbf\xb5\xe6\x88\x91\xe7\x82\xb9\xe7\x87\x83\xe7\x83\x9b\xe7\x81\xab\xe6\xb8\xa9\xe6\x9a\x96\xe5\xb2\x81\xe6\x9c\xab\xe7\x9a\x84\xe7\xa7\x8b\xe5\xa4\xa9'
'''
可以发现我们的文档以无编码显示,而是直接以二进制的形式显示了出来。
注意写的两种方式用byte模式也是一样的,只能写入二进制形式的文件。
有的伙伴还注意到了,我在字符串前面加了一个r,这个有什么用呢?
举例: r'xxxxx'
这相当于告诉计算机我的这个字符串里面的所有字符都没有特殊意思(如\t,\n),你正常给我显示就行了。
print('a\tb')
print(r'a\tb')
'''
a b
a\tb
'''
可以看到显示的值完全不一样,这就是r的作用。
- 说完了这些,大家有没有感觉到每一次都得手动调用close非常的麻烦,如果不调用close方法对已经打开的文件进行关闭,那么就会一直占用一定的计算机内存,这样无疑是一种很浪费资源的行为,所以我们可以使用with来管理open。
with open('example.txt',mode = 'rt' ,encoding = 'utf8') as frt:
print(frt.read())
'''
缓缓飘落的枫叶像思念我点燃烛火温暖岁末的秋天
'''
文件指针的相关操作
返回指针当前位置
- 文件对象返回当前指针的方法为tell
with open('example.txt' , mode = 'r+' , encoding = 'utf8') as fr:
fr.seek(3,0)
print(fr.tell()) #这里返回的位置是字节所在的位置,不是字符
with open('example.txt' , mode = 'a+' , encoding = 'utf8') as fr:
print(fr.tell())
'''
3
66
'''
移动指针到指定位置
- 文件对象改变指针位置的方向为seek
file.seek(offset,whence)
- offset:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
- whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
with open('example.txt' , mode = 'r+' , encoding = 'utf8') as fr:
file_size = fr.seek(0,2)
print(file_size)
fr.seek(file_size - 2,0)
print(fr.tell())
'''
66
64
'''
文件内容的修改
- 文件内容修改的思路是通过read读取(返回类型为str),然后将读取的内容通过str的相关方法进行修改,最后再对文件进行写入。
with open('example.txt' , mode = 'r' , encoding = 'utf8') as fr:
data = fr.read()
print(data)
data = data.replace('枫叶','龙卷风')
print(data)
with open('example.txt' , mode = 'w' , encoding = 'utf8') as fw:
print(fw.write(data))
'''
缓缓飘落的枫叶像思念我点燃烛火温暖岁末的秋天
缓缓飘落的龙卷风像思念我点燃烛火温暖岁末的秋天
23
'''
然后我们就完成了对文件内容的修改
同时打开两个文件的操作
下面展示一下同时打开两个文件操作的语法
with open('example.txt',mode = 'r',encoding = 'utf8') as fr ,
open('example_temp.txt',mode = 'w',encoding = 'utf8') as fw:
data = fr.read()
print(fw.write(data))
'''
23
'''