一.文件操作流程
f = open ('a.txt' ,mode='r' ,encoding='utf-8' )
data = f.read()
f.close()
二.资源回收和with上下文管理
1 、f.close()
2 、del f
with open ('a.txt' ,mode='w' , encoding='utf-8' ) as f:
pass
with open ('a.txt' ,mode='r' ,encoding='utf-8' ) as read_f,\
open ('b.txt' ,mode='w' , encoding='utf-8' ) as write_f:
data = read_f.read()
write_f.write(data)
三.指定操作文本文件的字符编码(在t模式下, 必须要指定字符编码)
'''
强调: t和b不能单独使用, 必须跟r/w/a连用
t 文本(默认的模式)
1. 读写都以str(unicode) 为单位的
2. 文本文件
3. 必须指定encoding='utf-8'
'''
with open ('a' , mode='rt' , encoding='utf-8' ) as f:
result = f.read()
print (result)
四.文件操作模式
4.1控制文件读写的操作
r(默认的):只读
w:只写
a:只追加写
4.1.1r模式+案例
with open ('aaa/a' , mode='rt' , encoding='utf-8' ) as f:
print ('第一次读' .center(10 , '-' ))
result = f.read()
print (result)
temp = True
list1 = []
while temp:
in_username = input ('your name>> ' ).strip()
in_password = input ('your pwd>> ' ).strip()
list1.append(in_username)
with open ('aaa/bbb' , mode='rt' , encoding='utf-8' ) as f1:
for line in f1:
name, pwd = line.strip().split(':' )
if in_username == name and in_password == pwd:
print ('login successful' )
temp = False
break
else :
print ('账号或者密码错误 ' )
if len (list1) == 3 :
print ('最多只能输入三次, 傻子' )
temp = False
4.1.2w模式+案例
with open ('aaa/ccc.txt' , mode='wt' , encoding='utf-8' ) as f:
f.write('哈哈哈\n' )
with open ('aaa/ddd.txt' , mode='wt' , encoding='utf-8' ) as f:
f.write('哈哈1\n' )
f.write('哈哈2\n' )
f.write('哈哈3\n' )
src_file = input ('源文件路径>>>: ' ).strip()
dst_file = input ('源文件路径>>>: ' ).strip()
with open (f'{src_file} ' , mode='rt' , encoding='utf-8' ) as f,\
open (f'{dst_file} ' , mode='wt' , encoding='utf-8' ) as f1:
res = f.read()
f1.write(res)
4.1.3a模式+案例
w 模式与a 模式的对比:
1. 相同点: 再打开的文件不关闭的情况下, 连续的写入, 新写的内容会在跟在前写的内容之后
2. 不同点: 以 a 模式重新打开文件, 不会清空原文件内容, 会将文件指针移动到文件末尾, 新写的内容永远写在最后
with open ('aaa/ddd.txt' , mode='at' , encoding='utf=8' ) as f:
f.write('哈哈哈哈哈哈\n' )
name = input ('your name: ' ).strip()
pwd = input ('your pwd: ' ).strip()
with open ('aaa/ddd.txt' , mode='at' , encoding='utf-8' ) as f:
f.write(f'账户名:{name} , 密码:{pwd} \n' )
4.1.4+模式
with open ('aaa/a' , mode='r+' , encoding='utf-8' ) as f:
print (f.read())
print (f.write('123' ))
4.2控制文件读写内容
"""
控制文件读写内容的方式
t:
1.读写都是以字符串(unicode) 为单位
2.只能针对文本文件
3.必须指定字符编码, 即必须指定encoding参数
b: binary模式
1.读写都是以bytes为单位
2.可以针对所有文件
3.一定不能指定字符编码, 即一定不能指定encoding参数
总结:
1.在操作纯文本文件方面t模式帮我们省去了编码与解码的环节, b模式则需要手动编码与解码, 所以此时t模式更为方变
2.针对非文本文件(如图片, 视频, 音频等) 只能使用b模式
"""
4.2.1t模式+案例
with open ('a.txt' , mode='rt' , encoding='utf-8' ) as f:
res=f.read()
print (type (res))
with open ('a.txt' ,mode='wt' ,encoding='utf-8' ) as f:
s='abc'
f.write(s)
4.2.2b模式+案例
with open (r'列表循环删除.jpg' , mode='rb' ) as f:
result = f.read()
print (result)
print (type (result))
with open (r'a.txt' , mode='rb' ) as f:
result = f.read()
print (result)
print (type (result))
print (result.decode('utf-8' ))
with open (r'a.txt' , mode='wb' ) as f:
f.write('你好hello' .encode('utf-8' ))
src_file = input ('源文件路径>> ' ).strip()
dst_file = input ('目标文件路径>> ' ).strip()
with open (fr'{src_file} ' , mode='rb' ) as f1, \
open (fr'{dst_file} ' , mode='wb' ) as f2:
for line in f1:
f2.write(line)
with open (r'列表循环删除.jpg' , mode='rb' ) as f:
while True :
result = f.read(1024 )
if len (result) == 0 :
break
print (len (result))
4.2.3x模式
'''
x模式(控制文件操作的模式)
x , 只写模式[不可读, 不存在则创建, 存在则报错
'''
with open ('a.txt' , mode='x' , encoding='utf-8' ) as f:
f.write('aaa' )
五.操作文件的方法
5.1(重点)
with open (r'a.txt' , mode='rt' , encoding='utf-8' ) as f:
res1 = f.readline()
print (res1)
while True :
line = f.readline()
if len (line) == 0 :
break
print (line)
with open (r'a.txt' , mode='rt' , encoding='utf-8' ) as f:
res = f.readlines()
print (res)
with open (r'a.txt' , mode='wt' , encoding='utf-8' ) as f:
list1 = ['111\n' , '222\n' , '333\n' ]
f.writelines(list1)
with open ('b.txt' , mode='wb' ) as f:
l = [
'1111\n' .encode('utf-8' ),
'122\n' .encode('utf-8' ),
'333\n' .encode('utf-8' )
]
l = [b'111' , b'222' , b'333' ]
f.writelines(l)
5.2(了解)
f.readable()
f.writable()
f.closed
f.encoding
f.flush()
f.name
六.控制文件指针移动
with open (r'a.txt' , mode='rt' , encoding='utf-8' ) as f:
result = f.read(2 )
print (result)
with open ('a.txt' ,mode='rb' ) as f:
data = f.read(3 )
6.1(0模式案例)
with open ('a.txt' ,mode='rt' ,encoding='utf-8' ) as f:
f.seek(3 ,0 )
print (f.tell())
print (f.read())
with open ('a.txt' ,mode='rb' ) as f:
f.seek(6 ,0 )
print (f.read().decode('utf-8' ))
with open ('a.txt' , mode='rb' ) as f:
f.seek(2 , 0 )
res = f.read()
print (res.decode('utf-8' ))
print (f.tell())
6.2(1模式案例)
with open ('a.txt' ,mode='rb' ) as f:
f.seek(3 ,1 )
print (f.tell())
f.seek(4 ,1 )
print (f.tell())
6.3(2模式案例)
abc你好
with open ('a.txt' ,mode='rb' ) as f:
f.seek(0 ,2 )
print (f.tell())
f.seek(-3 ,2 )
print (f.read().decode('utf-8' ))
import time
with open ('access.log' , mode='rb' ) as f:
f.seek(0 ,2 )
while True :
line = f.readline()
if len (line) == 0 :
time.sleep(0.5 )
else :
print (line.decode('utf-8' ),end='' )
七.文件修改的两种方式
7.1方式一
with open (r'a.txt' , mode='r' , encoding='utf-8' ) as f:
res = f.read()
data = res.replace('西施' , '小乔' )
with open (r'a.txt' , mode='w' , encoding='utf-8' ) as f1:
f1.write(data)
7.2方式二
import os
with open (r'a.txt' , mode='r' , encoding='utf-8' ) as f, \
open (r'.a.txt.swap' , mode='w' , encoding='utf-8' ) as f1:
for line in f:
f1.write(line.replace('小乔' , '西施' ))
os.remove('a.txt' )
os.rename('.a.txt.swap' , 'a.txt' )
八.seek的实例
8.1实时监控日志的增加的内容
"""
@作者: roc小白
@ QQ: 845726666
@专栏: https://www.cnblogs.com/jupeng/p/14939889.html
第一: 往文件里面写内容
"""
with open (r'a.txt' , mode='a' , encoding='utf-8' ) as f:
f.write('\n大乔, 17 female' )
import time
with open (r'a.txt' , mode='rb' ) as f:
f.seek(0 , 2 )
while True :
line = f.readline()
if not line:
time.sleep(0.3 )
else :
print (line.decode('utf-8' ), end='' )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix