文件的操作与处理
目录
文件操作
1.什么是文件?
文件其实是操作系统暴露给用户操作硬盘的快捷方式(接口)
2.代码如何操作文件
关键字open()
三步走:
1.利用关键字open打开文件
2.利用其它方法操作文件
3.关闭文件
文件路径
相对路径与绝对路径
路径中出现了字母与斜杠的组合产生了特殊含义如何取消
在路径字符串前面加一个r
eg:r'D:\py20\day08\a.txt'
格式:
open(文件路径,读写模式,字符编码)
文件路径与读写模式是必须的
字符编码是可选的(有些模式需要编码)
res = open('a.txt', 'r', encoding='utf8')
print(res.read())
res.close() # 关闭文件释放资源
# with上下文管理(能够自动帮你close())
with open(r'a.txt','r',encoding='utf8') as f1: # f1=open() f1.close()
print(f1.read())
"""以后代码操作文件 推荐使用with语法"""
3. 文件读、写、追加三模式
r 只读模式(只能看不能改)
# 路径不存在:直接报错
with open(r'b.txt', 'r', encoding='utf8') as f:
pass
# 路径存在
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 读取文件内所有的内容
f.write('123') # 写文件内容
w 只写模式(只能写不能看)
# 路径不存在:路径不存在自动创建
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
# 路径存在:1.会先清空文件内容 2.再执行写入操作
with open(r'a.txt', 'w', encoding='utf8') as f:
f.read()
f.write('hello world!\n')
f.write('hello world!\n')
f.write('hello world!\n')
a 只追加模式(追加内容, 同样不能读)
# 路径不存在, 创建一个新的文件,可以写入内容但不可以读
with open(r'money.txt', 'a', encoding='utf8') as f1:
# f1.read() # 报错
f1.write('insist study')
# 路径存在, 在文件内容的尾部追加新的写入内容
with open(r'money.txt', 'a', encoding='utf8') as f2:
f2.write('graduation from Oldboy')
小总结:
我们所学习的r w a读写模式都只能操作文本文件
4. 文件操作方法
1. 读系列
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 一次性读取文件内所有的内容
print(f.readline()) # 每次只读文件一行内容
print(f.readlines()) # 读取文件所有的内容 组织成列表 每个元素是文件的每行内容
print(f.readable()) # 判断当前文件是否具备读的能力
2.写系列
with open(r'a.txt','w',encoding='utf8') as f:
f.write('克服一切困难 奥利给!') # 往文件内写入文本内容
f.write(123) # 写入的内容必须是字符串类型
f.writelines(['jason','kevin','tony']) # 可以将列表中多个字符串元素全部写入
print(f.writable()) # True
print(f.readable()) # False
f.flush() # 直接将内存内文件数据刷到硬盘 相当于ctrl+s
5. 文件优化操作
with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()) # 一次性读取文件内所有的内容
# print(f.read()) # 一次性读取文件内所有的内容
# print(f.read()) # 一次性读取文件内所有的内容
"""
1.一次性读完之后 光标停留在了文件末尾 无法再次读取内容
2.该方法在读取大文件的时候 可能会造成内存溢出的情况
解决上述问题的策略就是逐行读取文件内容
"""
# for line in f: # 文件变量名f支持for循环 相当于一行行读取文件内容
# line
'''以后涉及到多行文件内容的情况一般都是采用for循环读取'''
6. 文件操作模式
t 文本模式
1.默认的模式
r w a >>> rt wt at
2.该模式所有操作都是以字符串基本单位(文本)
3.该模式必须要指定encoding参数
4.该模式只能操作文本文件
b 二进制模式
1.该模式可以操作任意类型的文件
2.该模式所有操作都是以bytes类型(二进制)基本单位
3.该模式不需要指定encoding参数
rb wb ab
二进制模式读写操作
with open(r'a.txt','rb') as f:
# print(f.read())
print(f.read(5).decode('utf8'))
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read())
print(f.read(4))
"""
read() 括号内可以放数字
在t模式下表示字符个数
在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
"""
文件内光标的移动(了解)
with open(r'b.txt', 'rb') as f:
print(f.read(4).decode('utf8'))
print(f.tell()) # 查看光标移动了多少个字节
f.seek(3, 1)
print(f.read().decode('utf8'))
"""
控制文件内光标的移动 f.seek()
f.seek(offset,whence)
offset表示位移量
始终是以字节为最小单位
正数从左往右移动
负数从右往左移动
whence表示模式
0:以文件开头为参考系(支持tb两种模式)
1:只支持b模式 以当前位置为参考系
2:只支持b模式 以文件末尾为参考系
"""
文件的内容修改(了解)
# 方式1 覆盖
with open(r'c.txt','r',encoding='utf8') as f:
data = f.read()
print(type(data))
with open(r'c.txt','w',encoding='utf8') as f1:
new_data = data.replace('tony','jason')
f1.write(new_data)
# 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt') # 删除原文件
os.rename('c.txt.swap', 'c.txt') # 重命名文件
"""
方式1:优点 在文件修改过程中同一份数据只有一份 缺点 如果文件过大内存会出现溢出从而崩溃
方式2: 优点 是内存不会出现溢出 缺点 在文件修改过程中同一份数据存了两份
"""