文件IO
⽂件读取可分为以下步骤:
- 打开⽂件 open()
- 读取⽂件内容 read()
- 关闭⽂件 close()
- open(“文件名”,“r”,encoding=“utf-8”)
读写模式分成4个维度理解:是否新建文件,是否能读写,是否覆盖,指针位置
r,w,a是三种基本模式,代表只读,只覆盖写和只追加写,后两者都会新建文件.三者的指针在开头
r+,w+,a+是三种增强模式,代表可覆盖读写;w+代表可覆盖读写,新增文件;a+是可追加读写,新增文件.r+文件指针在开头,其他两者的指针在结尾,用fp.seek(0,0)将指针移动到开头.
r或r+是不会新增文件的,w,w+,r,r+会新增文件,w,w+会覆盖原文件,a,a+会追加到原文件.
使用读模式打开,就不能用fp.write()方法写入;使用写和追加模式打开,就不能用fp.read()方法读取;使用增强模式才可以读取写入.
=建议使用a+,可读可写不覆盖,又会新建文件,只要记得用fp.seek(0)将指针移动就可以=
# fp = open("abc.txt",'w',encoding="utf8") # w只写(覆盖)
# fp = open("abc.txt",'r',encoding="utf8") # r只读
# fp = open("abc.txt",'a',encoding="utf8") # a只写(追加)
# fp = open("abc2.txt",'r+',encoding="utf-8") # r+可读可写,没有文件则报错,否则覆盖,文件指针在开始,如果要读,先将指针移动到开头fp.seek(0,0)
# fp = open("abc.txt",'w+',encoding="utf8") # w+可读可写,没有文件自动创建,有的话覆盖文件指针在结尾,如果要读,先将指针移动到开头fp.seek(0,0)
fp = open("abc3.txt",'a+',encoding="utf8") # a+可读可写,没有文件会创建,有的话会追加.追加指针在结尾,如果要读,先将指针移动到开头fp.seek(0,0)
# fp = open("a.img",'wb') #
for i in range(6,10):
fp.write("阿里巴巴"+str(i))
fp.seek(0,0)
print(fp.read()) # 读取所有内容
# print(fp.read(2)) # 读取5个字符
- read(),readline(),readlines()
fp.read() # 读取所有文本
fp.read(5) # 读取当前指针后5个字符
fp.readline() # 读取一行,直到遇上一个\n
fp.readline() # 读取第二行,直到遇上一个\n
fp.readline(5) # 相当于fp.read(5),读取5个字符,包含\n
fp.readlines() # 读取文本所有行,并将每行输出到一个列表
read()和eadlines()会⼀次读⼊⽂件全部内容,如果⽂件太⼤,会直接耗尽内存
的,因为⽂件对象可迭代,所以可以⽤for循环遍历⽂件读取:
with open('qfile.txt','r',encoding='utf-8') as fp:
for line in fp:
print(line.strip()) #注意⽆论是read、readline、readlines都会
# 读⼊⾏末的\n,所以需要⼿动剔除\n
- close()
=文件读写后一定要进行关闭操作,以释放资源=
fp.close()
(1) 使用try finally来释放
try:
fp = open("abc.txt","a+",encoding="utf-8")
fp.seek(0)
except:
pass
finally:
fp.close()
(2)自动关闭文件(with是一种魔术方法)
with open("abc.txt","r+",encoding="utf-8") as fp:
fp.read()
- 写入 write() writelines()
fp.write("字符串") # 写入字符串
fp.flush() # 刷新缓冲区(加速数据的流动,保证缓冲区的流畅)
写入多行writelines()
with open("a.txt","a+",encoding="utf-8") as fp:
list = ["abc","ccd","adsf","asfasf"]
data = [i+"\n" for i in list] #使用列表推异式
fp.writelines(data) # 将列表元素写入
fp.seek(0)
print(fp.read())
- 移动文件指针 seek() file_obj.seek(offset,whence=0)
offset是偏移量,相对于文件开头的,正数表示指针从头往尾移动,负数相反,为0则指针会在文件开头,
whence是文件指针的位置,可选参数,只能为0
fp.seek(0,0) #指针在文件开头
fp.seek(0) # 指针在文件开头
fp.tell() # 显示指针位置
OS模块
os模块是内置模块,使用import os导入
下表函数标黑的重要:
常用操作:
- 递归遍历目录
# 递归遍历目录
for root,dirnames,files in os.walk(os.getcwd()):
# print(root,dirnames) # root即当前目录,dirname是子目录列表
print(files) # files 当前目录的文件列表
# print(root)
print(dirnames) # 文件名
路径拼接(django常用)
os.path.join(os.getcwd(),"a.txt")
# D:\qianfeng\python_basic\第24天_文件和目录\代码\a.txt
获取文件扩展名
path = os.path.join(os.getcwd(),"a.txt") # 路径拼接
a = os.path.splitext(path)
if len(a) >= 1:
print(a)
判断是否文件或目录
print(os.path.isfile("c:\\swapfile.sys"))
print(os.path.isfile("c:\\360Safe"))
判断文件目录是否存在
print(os.path.exists("c:\\360Saf"))
print(os.path.exists("c:\\hiberfil.sys"))
获取文件的大小
print(os.path.getsize("d:\\fib.txt")) # 1151字节,除以1024才是K,不到1KB,操作系统中显示1.12K
``
获取目录名,文件名,绝对目录
```py
print(os.path.basename("c:\\360Safe\\SoftMgr\\360Newsld.exe")) #最后一级的文件名360Newsld.exe(如果是目录就是目录名,如os.path.basename("c:\\360Safe\\SoftMgr")返回SoftMgr)
print(os.path.dirname("c:\\360Safe\\SoftMgr\\360Newsld.exe")) # 目录名 c:\360Safe\SoftMgr
print(os.path.abspath("c:\\360Safe\\SoftMgr\\MultiTip.exe")) #绝对路径名c:\360Safe\SoftMgr\MultiTip.exe