python-文件操作(一)
目录
文件操作
1、什么是文件?
- 文件是操作系统暴露给用户操作硬盘的‘接口’。
2、操作文件的方法:
- 打开文件:open()
- 关闭文件:close()
3、路径分类:
- 绝对路径
- 相对路径
4、如何取消特殊字符的功能:
- 在路径前加‘r’
- 在\前再加一个\
5、对文件的操作有:读、写、追加内容
- r:路径存在只读模式不能修改,路径不存在直接报错
- w:路径存在每打开一次都会清除文件内的内容,路径不存在自动创建
- a:路径存在会将文件指针直接移动到文件末尾,在文件不存在时会创建空文档
实例如下:
# 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
6、with上下文管理
解决了总是忘记关闭文件的问题,用with关键字执行完代码后会自动关闭文件,释放资源
-
with语法格式:
with open(‘文件名’,’r/w’) as f:
f.读操作/f.写操作
-
with还可以同时打开多个文件:
with open(‘文件名1’,’r/w’) as f1, open(‘文件名2’) as f2:
pass
实例如下:
# 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
7、文件操作方法详细:
1、r-读操作
- read():一次性读取文件所有内容
- readline():每次只读一行内容
- readlines():读取文件所有内容,组织成列表,每个元素是文件的每行内容
- readable():判断当前文件是否具备读的能力
实例如下:
# 选择提前创建好的文件,然后打开验证功能
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
2、w-写操作
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())
8、文件优化操作
当使用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='')
9、文件操作模式
-
文本模式—— t
- rt :读
- wt :写
- at :追加内容
文件操作默认为文本模式,该模式只能操作文本文件,以字符串为参数,必须指定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('七')
# 结果
# 六七
-
二进制模式—— b
- rb :读
- wb :写
- ab :追加
该模式可以操作任意类型的文件,该模式不需要指定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)
点个赞再走吧!
点个赞再走吧!
点个赞再走吧!