python | 文件的操作
文件操作
文件打开
文件打开
方式一:必须手动关闭文件句柄,路径尽量使用绝对路径。
f =open('文件路径',encoding='解码方式',mode='打开模式')
pass
f.close
方式二(推荐):不用手动关闭,使用完后自动关闭。
with open('文件路径',encoding='解码方式',mode='打开模式')as f:
pass
用方式二打开多个文件句柄,用,\分开。
with open('文件路径',encoding='解码方式',mode='打开模式')as f1,\
open('文件路径',encoding='解码方式',mode='打开模式')as f2:
pass
路径
os模块:系统操作系统模块
sys模块:解释器操作模块
将文件路径导入默认路径sys.path后,打开当前文件时路径可以直接使用文件名打开。
默认路径一般包括当前项目路径,当前脚本父路径,python解释器安装路径下的一部分路径。
__file__:文件绝对路径
os.path.dirname(__file__) :父路径
os.path.dirname()可以继续套娃
import os
import sys
sys.path.append(os.path.dirname(__file__)+'/bb')
创建可变的绝对路径。
import os
path=os.path.dirname(__file__)
操作模式
1、读:r,rb(binary),r+,r+b。
默认r按照编码方式读文件;rb读比特流,一般用作读取非文本文件;r+读和追加,在读取的光标后面追加;r+b读和追加比特流。无法自动创建文件。
2、写:w,wb,w+,w+b。
打开文件,清空后写入,无指定文件时可以自动创建。
3、追加:a,ab,a+a+b
打开文件,从文件最后追加写入,无指定文件时可以自动创建。
4、文本:t(text)
默认按照文本文件方式读出。
文件读的方式
(1)一次性全部读取
with open('文件路径',encoding='utf-8')as f:
content=f.read()
print(content)
(2)按照指定字符读取
with open('文件路径',encoding='utf-8')as f:
content=f.read(4)
print(content)
(3)只读取一行,读完换行
with open('文件路径',encoding='utf-8')as f:
content=f.readline()
print(content)
(4)逐行读取,返回一个列表
with open('文件路径',encoding='utf-8')as f:
content=f.readlines()
print(content)
(5)for循环迭代读取,内存中读取一行,打印一行,节省内存,适合读取大文件(推荐)
with open('文件路径',encoding='utf-8')as f:
for line in f:
print(line)
文件写入和追加的方式
写和追加相似,区别在于重新创建文件句柄后,是否会清空文件。
文件的写入
with open('文件路径',encoding='utf-8',mode='w')as f:
f.write('写入内容')
文件的追加
with open('文件路径',encoding='utf-8',mode='a')as f:
f.write('追加内容')
文件的改操作
1、以读的模式打开原文件
2、以写的模式创建新文件
3、将原文件读出的内容修改,写入新文件
4、将原文件删除
5、将新文件重命名成原文件
import os
with open('6文件的改操作', encoding='utf-8')as f1,\
open('6文件的改操作.bak',encoding='utf-8',mode='w')as f2:
for line in f1:
new_line=line.replace('ab','AB')
f2.write(new_line)
os.remove('文件的改操作')
os.rename('文件的改操作.bak', '文件的改操作')
其他操作
tell 获取光标字节位置
with open('文件的其他功能', encoding='utf-8')as f:
f.read()
print(f.tell())
seek 调整光标字节位置
with open('文件的其他功能', encoding='utf-8')as f:
f.seek(3) #f2.seek(0,2)光标移动到最后
content=f.read()
print(content)
flush 强制刷新(保存)
with open('文件的其他功能', encoding='utf-8', mode='w')as f:
f.write('文件的其他功能:tell seek flush')
f.flush()
json模块
可将数据类型转为字符串,set 除外,tuple 使用 json 转为字符串,再转回来会变为 list 数据类型。兼容性好。
直接序列化写入文件
使用dump直接写入文件时,只能写入一次,否则load读取出来会出错,原因是文件中间存在多余的""。
import json
with open('a.txt',mode='w',encoding='utf-8') as f:
json.dump([1,2,3],f)
with open('a.txt',encoding='utf-8') as f:
print(json.load(f))
先在内存中序列化,再写入文件
想要可以多次写入w,可以再内存中dumps,再写入文件,也可以多次loads。
import json
with open('b.txt',mode='a',encoding='utf-8') as f:
f.write(json.dumps([2,3,3])+'\n')
f.write(json.dumps([2,3,3])+'\n')
with open('b.txt',encoding='utf-8') as f:
print(json.loads(f.readline().strip()))
print(json.loads(f.readline().strip()))
上述读取需要知道文件行数,大于文件行数会报错,可使用异常处理try解决。
import json
with open('b.txt',encoding='utf-8') as f:
while True:
try:
print(json.loads(f2.readline().strip()))
except json.decoder.JSONDecodeError:
break
pickle模块
可将数据转为字节串,可多次写入读取,使用b二进制的写入读取模式。
import pickle
with open('c.txt',mode='wb')as f:
pickle.dump((1,2,3),f)
pickle.dump((1,2,),f)
with open('c.txt',mode='rb')as f:
print(pickle.load(f))
print(pickle.load(f))

浙公网安备 33010602011771号