1.文件介绍
文件是操作系统提供给用户/应用程序操作硬盘数据的一种虚拟的概念/接口。
用户/应用程序可以通过文件将数据永久保存到硬盘中。
(用户直接操作的是文件,对文件进行的所有操作,都是在给操作系统发送系统调用,再操作系统转换成具体的硬盘操作。)
大前提: tb模式均不能单独使用,必须与r/w/a之一结合使用
t(默认的):文本模式
1. 读写文件都是以字符串str (在内存中其实就是Unicode)为单位的
2. 只能针对文本文件
3. 必须指定encoding参数('utf-8' )
b:二进制模式:
1. 读写文件都是以bytes /二进制为单位的
2. 可以针对所有文件
3. 一定不能指定encoding参数
r:只读 【不可写,不存在则报错】 -默认的-
w:只写 【不可读,不存在则创建,存在则全删,指针位于开头】
a:只追加写 【不可读,不存在则创建,存在则指针位于最后】
x,只写 【不可读;不存在则创建,存在则报错】 -了解-
+:r+、w+、a+连用,表明各自相应的可读可写模式
2.基本操作流程与资源回收
字符串前加r ,表示原生字符串,不转义。
eg: r'c:\a\b\c\d.txt'
打开文件、读写文件、关闭文件
f = open (r'a.txt' , mode='rt' , encoding='utf-8' )
res = f.read()
print (res)
f.close()
del f
3. with上下文管理
with open ('a.txt' , mode='r' ,encoding='utf-8' ) as f:
res = f.read()
print (res)
with open ('a.txt' , mode='r' , encoding='utf-8' ) as f1, open ('b.txt' , 'r' , encoding='utf-8' )as f2:
res1 = f1.read()
res2 = f2.read()
print (res1)
print (res2)
4.详细介绍文件模式
4.1控制文件读写操作的模式
with open ('a.txt' , mode='rt' , encoding='utf-8' ) as f:
print ('第一次读,指针在文件开头位置' .center(40 , '*' ))
res1 = f.read()
print (res1)
print ('第二次读,指针在文件最后位置' .center(40 , '*' ))
res2 = f.read()
print (res2)
with open ('c.txt' , mode='wt' , encoding='utf-8' ) as f:
f.write('只读模式测试第一行\n' )
f.write('只读模式测试第二行\n' )
with open ('c.txt' , mode='at' , encoding='utf-8' ) as f:
f.write('只读模式测试第三行\n' )
f.write('只读模式测试第四行\n' )
w 与 r 的区别:w常用于新建文件写入,r常用于旧文件读取
+ 模式:与 r、w、a 连用,表明可读可写,会有各自的特性(r:文件不存在时,就报错)
---不常用,基本都是只读只写
4.2控制文件读写内容的模式
大前提: tb模式均不能单独使用,必须与r/w/a之一结合使用
1. 读写文件都是以字符串str (在内存中其实就是Unicode)为单位的
2. 只能针对文本文件
3. 必须指定encoding参数('utf-8' )
1. 读写文件都是以bytes /二进制为单位的
2. 可以针对所有文件
3. 一定不能指定encoding参数
4.3 循环读取文件
with open (r'1.gif' , mode='rb' ) as f:
while True :
res = f.read(1024 )
if len (res) == 0 :
break
print (len (res))
with open (r'1.gif' , mode='rb' ) as f:
for line in f:
res = f.read(1024 )
print (res)
5.文件的操作其他方法
f.read()
f.readline()
f.readlines()
f.read()与f.readlines()都是将内容一次性读入内容,
如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,
有两种实现方式:以读取字节 或 以读取行 为while 和for 循环读取的方式
f.write('1111\n222\n' )
f.write('1111\n222\n' .encode('utf-8' ))
f.writelines(['333\n' , '444\n' ])
l = ['333\n' , '444\n' ]
for line in l:
f.write(line)
f.writelines([bytes ('333\n' ,encoding='utf-8' ),'444\n' .encode('utf-8' )])
f.readable()
f.writable()
f.closed
f.encoding
f.flush()
f.name
6.文件的高级操作:控制文件指针的移动
文件内指针的移动都是Bytes/字节为单位的,
唯一例外的是t模式下的read(n), n以字符为单位,代表字符个数
with open ('a.txt' , mode='rt' , encoding='utf-8' ) as f:
data = f.read(3 )
with open ('a.txt' , mode='rb' ) as f:
data = f.read(3 )
若想读取文件某一特定位置的数据,则需要用f.seek方法主动控制文件内指针的移动。
0 : 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
1 : 该模式代表指针移动的字节数是以当前所在的位置为参照的
2 : 该模式代表指针移动的字节数是以文件末尾的位置为参照的
f.seek(9 , 0 )
f.seek(3 , 0 )
f.seek(9 , 1 )
f.seek(3 , 1 )
f.seek(-9 , 2 )
f.seek(-3 , 2 )
7.文件修改的两种方式
with open ('b.txt' , mode='r' , encoding='utf-8' ) as f:
res = f.read()
data = res.replace('dsb' , 'Alex' )
with open ('b.txt' , 'w' , encoding='utf-8' ) as f:
f.write(data)
import os
with open ('b.txt' , 'r' , encoding='utf-8' ) as f1,\
open ('.b.txt.swap' , 'w' , encoding='utf-8' ) as f2:
for line in f1:
f2.write(line.replace('Alex' , 'dsb' ))
os.remove('b.txt' )
os.rename('.b.txt.swap' , 'b.txt' )
1. 方式一:节省了硬盘空间(只有一份文件),但浪费了内存空间(一次性读入到内存)
2. 方式二:浪费了硬盘空间(同时存在两份文件),但节约了内存空间(一次性只读入了一行数据到内存)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2021-06-10 Day58--日考题--[lambda x: i * x for i in range(4)] 知识点:闭包原理 名称空间与作用域