* 打开文件的模式
模式选择
文件的上下文管理
with open(....)as f:
文件读写模式(常用r、w模式)rwa:称纯净模式
r 只读模式
1.文件不存在,报错
2.文件存在,光标在文件开头(什么都没开始读)
w 只写模式
1.文件不存在 自动创建新文件
2.文件存在 先清空文件内容在执行写入
a 只追加模式(只能在文件的末尾添加内容)
1.文件不存在,自动创建新文件
2.文件存在,光标直接在文件末尾
文件操作单位
t 文本模式(只读文本的文件)
只能和rwa连用 ,并且不写的情况,默认是t
b 原生的二进制
1.只能和rwa连用
2.该模式通常用来处理非文本文件
3.直接存储网络上传输过来的二进制数据
r 只读
r+ 读写,不创建
w 新建只写
w+ 新建读写
区别:
r+与w+ :r+读写,若文件不存在,报错
w+可读可写,若文件不存在,创建
# r+ 读写模式
# with open(r'test', mode='r+', encoding='utf-8')as f: # 后面参数不写,默认rt模式
# print(f.readable()) # 可读
# print(f.writable()) # 可写
#
# # print(f.readline()) # 读一行
# print(f.read()) # 读全部
# # f.write('hahhas') # 末尾添加
# r+b 读写,并转换成二进制模式
with open(r'test', mode='r+b')as f: # 后面参数不写,默认rt模式
print(f.readable()) # 可读
print(f.writable()) # 可写
# print(f.read())
res = f.read()
# print(res)
# 1.二进制转换utf-8
# print(res.decode('utf-8'))
# 2.解码
res1 = str(res, encoding='utf-8')
print(res1)
一、修改文件的两种方法
第一种方式修改文件:
修改文件:
1.将数据由硬盘读到内存(读文件)
2.在内存中完成修改(字符串的替换)
3.再覆盖原来的内容(写文件)
优点:硬盘上只有一个文件
缺点:当文件过大的情况下,可能会造成内存溢出
replace 替换
with open(r'test02', 'r', encoding='utf-8') as f:
res = f.read()
print(res)with open(r'test02', 'w', encoding='utf-8')as f:
data = res.replace('jeff', 'gyy') # 替换
print(data)
f.write(data)
第二种方式修改文件:
import os
1.创建一个新文件
2.读取老文件内容到内存进行修改 将修改好的内容写到新文件当中
3.将老文件删除 将新文件的名字改成老文件
优点:内存中始终只有一行内容,不占内存
缺点:在某一时刻硬盘上会同时存在两个文件
with open(r'test02', 'r', encoding='utf-8') as read_f,
open(r'test02.swap', 'a', encoding='utf-8') as write_f:
for line in read_f:
new_line = line.replace('gyy', 'cjm')
write_f.write(new_line)
os.remove(r'test02') # 删除老文件
os.rename(r'test02.swap', 'test02') # 新文件改名为老文件名字
二、字符编码
encode 编码
decode 解码
乱码原则:用什么编码就用什么解码
a = "嘉"
# 第一种编码,解码
res = a.encode('utf-8') # 编码
print(res.decode('utf-8')) # 解码
# 第二种编码,解码
res1 = bytes(a, encoding='utf-8') # 编码二进制
print(res1, type(res1)) # 显示编码结果
# print(res1.decode('utf-8')) # 解码,并显示
res2 = str(res1, encoding='utf-8') # 解码二进制
print(res2, type(res2))
三、进制转换
# 其他进制转10进制
dd = int('1100', 2)
print(dd)
# 10进制转2进制
aa = bin(666)
print(aa)
# 10进制转8进制
bb = oct(666)
print(bb)
# 10进制转16进制
cc = hex(666)
print(cc)
四、文件内光标移动
一: read(3):
- 文件打开方式为文本模式时,代表读取3个字符
- 文件打开方式为b模式时,代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
- seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
f.seek(offset,whence)
offset 相对偏移量,光标移动的位数
whence:
0:参照文件的开头
1:参照光标所在当前位置 只能在b模式下使用
2:参照文件的末尾 只能在b模式下使用
- truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
import time
with open('test.txt','rb') as f:
f.seek(0,2) # 光标移动
while True:
line=f.readline()
if line:
print(line.decode('utf-8'))
else:
time.sleep(0.2)
五、截断文件
truncate() 方法用于截断文件并返回截断的字节长度。
指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。
fileObject.truncate([size])