目录
实例如下:
# 1.以只读,utf8编码模式打开当前路径下的a.txt文件
#首先在当前路径创建a.txt文件
res = open('a.txt',mode='r',encoding='utf8')
# 查看内容
print(res.read())
# 对文件操作完必须关掉,释放资源
res.close()
res1 = open(r'E:\python item\Old_BoyClass_second\a.txt',mode='r',encoding='utf8')
# 绝对路径前加r,取消\a原有的功能
print(res1.read())
# 对文件操作完必须关掉,释放资源
res1.close()
#结果,上下两种操作结果一样
我要坚持学python!
我要坚持学python!
#2. 以写,utf8编码模式打开当前路径下的a.txt文件
res = open('a.txt', mode='w', encoding='utf8')
# 输入hello内容,清除了以前的我要坚持学python!
res.write('hello')
# 对文件操作完必须关掉,释放资源
res.close()
#结果,在a.txt文件中存入
hello
#3. 以追加内容,写功能,utf8编码模式打开当前路径下的a.txt文件
res = open('a.txt', mode='a', encoding='utf8')
# 输入hello内容,清除了以前的我要坚持学python!
res.write(' world\n')
res.write('python\n')
# 对文件操作完必须关掉,释放资源
res.close()
#结果,在a.txt文件中追加world和python字符
world
python
解决了总是忘记关闭文件的问题,用with关键字执行完代码后会自动关闭文件,释放资源
实例如下:
# with关键字上下文管理
# 打开一个不存在的文件,相当于创建
with open('b.txt', mode='w') as f1:
f1.write('hello world!')
# 打开多个文件,相当于创建
with open('c.txt',mode='w') as f2,open('d.txt',mode='w') as f3:
#分别在c.txt文件和d.txt文件中存入Hammer和python
f2.write("Hammer")
f3.write('python')
#结果
hello world!
Hammer
python
实例如下:
# 选择提前创建好的文件,然后打开验证功能
with open(r'E:\python item\Old_BoyClass_second\test.txt', mode='r', encoding='utf8') as read_f:
# 读取文件所有内容
# print(read_f.read())
# 结果
'''
只读第一行
只读第二行
只读第三行'''
# 每次只读取一行
# print(read_f.readline())
#结果
# 只读第一行
# 读取文件所有内容,转换成列表的形式
# print(read_f.readlines())
#结果
# ['只读第一行\n', '只读第二行\n', '只读第三行']
# 判断文件是否可读
print(read_f.readable())
#结果
True
write():往文件内写入文本,写入的内容必须是字符串(文本)
writelines():可以将列表中多个字符串元素全部写入,只能写字符串类型
writeable():判断该文件是否可以执行写操作
实例如下:
# 选择提前创建好的文件,然后打开验证功能
with open(r'E:\python item\Old_BoyClass_second\test.txt', mode='w', encoding='utf8') as write_f:
# 每次执行写操作,会清空文件以前的内容,再添加写入的内容
# write_f.write('清空文件内容,写入第一行')
# 可以将列表内多个元素同时写入
# write_f.writelines(['Hammer', 'Ze', '求关注'])
# 判断该文件是否具有写功能
print(write_f.writable())
当使用read()方法遇到比较大的文件时一次性读取文件所有内容会可能造成内存溢出的情况,为了解决上述问题,利用逐行读取文件内容的方式,利用for循环,读取一行结束后python垃圾回收机制会回收释放空间。
实例如下:
# 选择提前创建好的文件,然后打开验证功能
with open(r'E:\python item\Old_BoyClass_second\test.txt', mode='r', encoding='utf8') as write_f:
for line in write_f:
# 遍历的结果自带换行,不要换行可以end = ' ',来取消换行
print(line,end='')
文件操作默认为文本模式,该模式只能操作文本文件,以字符串为参数,必须指定encoding参数
实例如下:
# 选择提前创建好的文件,然后打开验证功能
# 文本模式
with open(r'test.txt', 'rt', encoding='utf8') as f:
print(f.read())
# 结果
# 一
# 二
# 三
# 四
# 五
with open(r'test.txt', 'wt', encoding='utf8') as f:
f.write('六')
# 结果
# 六
with open(r'test.txt', 'at', encoding='utf8') as f:
f.write('七')
# 结果
# 六七
该模式可以操作任意类型的文件,该模式不需要指定encoding参数,以二进制位符号位基本单位
实例如下:
# 选择提前创建好的文件,然后打开验证功能
# 二进制模式,不用写encoding参数,写encoding参数会报错
# 二进制模式操作文本文件,读功能
with open(r'test.txt', 'rb') as f:
print(f.read())
# 结果
# b'\xe5\x85\xad\xe4\xb8\x83'
# 二进制模式操作文本文件,追加/写功能
with open(r'test.txt', 'ab') as f1:
# 只能写二进制符号,不然会报错
# f1.write('abc123')
# TypeError: a bytes-like object is required, not 'str'
# 只能通过编码的形式来写入文本encode
a = 'abc123'
f1.write(a.encode())
# 结果
# abc123
# 再解码回来
print(b'abc123'.decode())
# 结果
# abc123
# 二进制操作图片文件
with open(r'E:\python item\Old_BoyClass_second\点赞.gif','rb') as f3:
print(f3.read())
# 结果太眼花了大家自己输出一下吧
练习题:
# 3.写一个简易的拷贝工具支持所有的文件类型
#copy test.txt文件生成copytest.txt,因为支持所有文件所以选择二进制模式操作文件
with open(r'test.txt', 'rb') as read_f, open(r'copytest.txt', 'ab') as copy_f:
# 用for循环打印读取的内容,防止内存溢出
for content in read_f:
# print(content)
# 写入遍历得到的内容
copy_f.write(content)