1、编码格式
编码格式决定了占据磁盘空间的大小,即同样的文件选择不同的编码格式,内存是不同的。
在文件的第一行可以用下面的方法选择编码格式
# encoding = gbk
# encoding = UTF-8
更详细的内容请查看B站视频https://www.bilibili.com/video/BV1wD4y1o7AS?p=128
2、文件读写
我们的数据就像水流一样,通过管道流入程序,或者从管道当中流出程序进入磁盘,因此文件读写通常称为“IO操作”(Input Output),读写操作运用到“队列”这种数据结构的特点:先进先出(管道单向,先进去的先流出)
首先打开a.txt,查看其中的内容
早上好!
今天依然要努力学习啊!
用python程序打开,不过得先确认自己的文件格式,我这里的是UTF-8
读好的文件必须进行关闭file.close()
,否则浪费内存,还会使下一次打开文件出现问题。
file = open("a.txt", 'r', encoding='UTF-8')
print(file.readlines()) # 将文件的所有内容读取出来放到列表里
file.close()
'''
['早上好!\n', '今天依然要努力学习啊!\n']
'''
当时用“a”模式打开时,可以在文件末尾追加内容,当追加的是中文,要将编码格式改为GBK否则出现乱码(下面是运行两次得到的结果)
file = open("a.txt", 'a', encoding='GBK')
file.write('今天学习了嘛?')
file.close()
'''
早上好!
今天依然要努力学习啊!
今天学习了嘛?今天学习了嘛?
'''
3、文件对象的常用方法
(1)file.realines()
读取文件所有的字符,包括换行符,返回列表
file = open("a.txt", 'r', encoding='GBK')
print(file.read())
file.close()
'''
今天依然要努力学习啊!
今天学习了嘛?今天学习了嘛?
'''
(2)file.readline()
以换行符为界按行读取
file = open("a.txt", 'r', encoding='GBK')
print(file.readline())
file.close()
'''
早上好!
'''
(3) file.read()
不显示"\n",只读取前x个字符,不能识别表情文字
file = open("a.txt", 'r', encoding='GBK')
print(file.read(2))
file.close()
'''
早上
'''
(4)file.tell()
返回指针当前位置
file = open("a.txt", 'r')
file.read()
print(file.tell())
file.close()
'''
90
'''
(5)file.seek(x,y)
从y位置将文件指针跳过x个字符
.seek(offset[, whence])
- offset :开始的偏移量,也就是代表需要移动偏移的字节数
- whence:可不填,默认值为0。表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
file = open("a.txt", 'rb')
file.seek(2, 0) # 从0开始移动2位
print(file.tell())
file.seek(2, 1) # 从当前位置开始(即2)移动2位
print('---------')
print(file.tell())
file.close()
'''
2
---------
4
'''
有时候会报错为 io.UnsupportedOperation: can't do nonzero cur-relative seeks
因为没有使用b模式(wb、rb)打开的文件,只允许从文件头开始计算相对位置,从其他位置计算时就会引发异常
(6)file.write('\n')
将字符串str写入文件、file.writelines(lst)
将列表lst写入文件
file = open("a.txt", 'w')
lst = ['Good', ' ', 'morning', '!']
for i in range(6):
file.writelines(lst)
file.write('\n')
file.close()
'''
Good morning!
Good morning!
Good morning!
Good morning!
Good morning!
Good morning!
'''
4、with操作
with语句能自动管理上下文资源,不管因为什么原跳出with模块,都能确保文件正常关闭,以达到释放资源的目的。所以打开文件时建议使用with操作。
一个类对象实现了
__enter __()
和__exit__()
两种方法,称该类对象遵守上下文管理器协议,这个类对象的实例对象称为上下文管理器
用二进制方式打开图片并复制一份
with open('husky_little.jpg', 'rb') as source_file:
with open('copy_husky.jpg', 'wb') as copy_file:
copy_file.write(source_file.read())