python基础学习day10-文件操作(IO技术)
文本文件和二进制文件
1、文本文件是可以用记事本打开的文件,存储的是普通”字符“文本,python默认为Unicode字符集(两个字节表示一个字符,最多可以表示:65536个)。但是像word软件编辑的文件不是文本文件。
2、二进制文件
无法用记事本打开,必须使用专用的软件解码,常见的有:doc、MP4视频文件等。已字节为单位。
文件操作相关模块
图中为文件操作相关模块。
创建文件对象open()
基本语法格式为:
open(文件名[,打开方式])
文件名可以录入全路径,比如:D:\a\b.txt
可以使用原始字符串:r"d:\b.txt"
f=open(r"d:\b.txt","w"
打开方式有如下几种:
文本文件的写入
三个步骤:
1、创建文件对象
2、写入数据
3、关闭文件对象
操作:文本写入操作简单测试
#文本写入操作测试
f=open(r"a.txt","a")
s="itbaizhan\nsxt\n"
f.write(s)
f.close()
运行结果:
write()/writelines()写入数据
操作:
#测试writelines写入
f = open(r"bb.txt","w",encoding="utf-8")
s = ["素素\n","小二\n","小三\n"]
f.writelines(s)
f.close()
运行结果:
close()关闭文件流
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显示调用close()方法关闭文件对象。一般结合异常机制的finally或者with关键字实现无论何种情况都能关闭打开的文件对象。
操作代码:
**#结合异常机制finally确保关闭文件对象
try:
f =open(r"my01.txt","a")
str="susu"
f.write(str)
except BaseException as e:
print(e)
finally:
f.close()**
文件文本读取
文件的读取一般使用如下三个方法:
**1.read([size])😗*从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件,读到文件末尾,会返回空字符串。
**2.readline()😗*读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
**3、readlines()😗*文本文件中,每一行作为一个字符串存入列表中,返回该列表。
操作:
#读取一个文件前4个字符
with open(r"bb.txt","r",encoding="utf-8")as f:
print(f.read(4))
#文件较小,一次性读取全部内容
with open(r"bb.txt","r",encoding="utf-8")as f:
print(f.read())
#按行读取一个文件
with open(r"bb.txt","r",encoding="utf-8")as f:
while True:
fragment=f.readline()
if not fragment:
break
else:
print(fragment,end="")
#为文本文件每一行的末尾增加行号
with open(r"bb.txt","r",encoding="utf-8")as f:
lines= f.readlines()
lines=[line.rstrip()+"#"+str(index+1)+"\n"for index,line in enumerate(lines)]#推导式生成列表
with open(r"bb.txt","w",encoding="utf-8")as f:
f.writelines(lines)
运行结果:
二进制文件的读取和写入
二进制文件的处理流程和文本文件一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建二进制文件对象。
例如:
f.open(r"d:\a.txt","wb") #可写的、重写二进制文件对象
f.open(r"d:\a.txt","ab") #可加的,追加模式的二进制文件对象
f.open(r"d:\a.txt","rb") #可读的,二进制文件对象
创建好二进制文件对象后,仍然可以对文件进行write(),read()实现文件的读写操作。
操作:读取图片文件,实现对文件的拷贝
with open("aa.gif","rb")as f:
with open("a_copy.gif","wb")as w:
for line in f.readlines():
w.write(line)
print("图片拷贝完成!")
运行结果:
文件任意位置操作
文件具有很多常用的属性和方法,以seek()移动文件指针为例:
操作:
#测试seek()移动指针位置示例
with open(r"bb.txt","r",encoding="utf-8")as f:
print("文件名是{0}".format(f.name))
print(f.tell())#返回文件指针的当前位置
print("文件读取内容是{0}".format(str(f.readline())))
print(f.tell())
f.seek(0,0)#从文件头开始计算指针移动位置
print("文件读取内容是{0}".format(str(f.readline())))
运行结果:
使用pickle()序列化
对象的本质是”存储数据的内存块“,有时候我们需要将这些”内存块“保存到硬盘上,或者通过网络传输到其他的机器上,。这个时候我们就需要”对象的序列化和反序列化“。
序列化指的是:将对象转化成”串行化“数据形式,存储到硬盘或者通过网络传输到其他地方:
反序列化是指:与序列化相反的过程,是将读取到的”串行化数据“转化成对象。
可以使用pickle模块中的函数,实现序列化和反序列化操作。
pickle.dump(obj,file) obj就是要被序列化的对象,file指的是存储的文件
pickle.load(file) 从file读取数据,反序列化成对象
操作:
#将对象序列化到文件中
import pickle
with open(r"d:\data.dat","wb")as f:
a1="素素"
a2="123"
a3=[10,20,30]
pickle.dump(a1,f)
pickle.dump(a2,f)
pickle.dump(a3,f)
#将获得的数据反序列化成对象
import pickle
with open(r"d:\data.dat","rb")as f:
a1=pickle.load(f)
a2 = pickle.load(f)
a3= pickle.load(f)
print(a1)
print(a2)
print(a3)
运行结果:
os和os.path 模块
os 模块可以帮助我们直接对操作系统进行操作。我可以直接调用操作系统的可执行文件、命令、直接操作文件、目录等。
os.system 可以帮助我们直接调用系统命令
os.startfile 直接调用可执行文件
示例操作:
#os.system调用windows系统的记事本程序
import os
os.system("notepad.exe")
#os.system调用windows系统的ping命令
import os
os.system("ping www.baidu.com")
运行结果:
操作:运行安装好的微信
#运行安装好的微信
import os
os.startfile(r"D:\Program Files (x86)\Tencent\WeChat\WeChat.exe")
os.path模块
os.path模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
操作:测试os.path常用方法
#测试os.path常用方法
import os
import os.path
print(os.path.isabs("d:/a.txt")) #是否绝对路径
print(os.path.isdir("d:/a.txt")) #是否目录
print(os.path.isfile("d:/a.txt")) #是否文件
print(os.path.exists("d:/a.txt")) #是否存在
'''获得文件基本信息'''
print(os.path.getsize("b.txt")) #文件大小
print(os.path.abspath("b.txt")) #输出绝对路径
print(os.path.dirname("d:/a.txt")) #输出所在目录
print(os.path.getctime("b.txt")) #返回创建时间
print(os.path.getatime("b.txt")) #返回最后访问时间
print(os.path.getmtime("b.txt")) #返回最后修改时间
path = os.path.abspath("b.txt") #返回绝对路径
print(os.path.split(path)) #返回元组:目录、文件
print(os.path.splitext(path)) #返回元组:路径、扩展名
print(os.path.join("aa","bb","cc")) #返回路径:aa/bb/cc
运行结果:
walk()递归遍历所有文件和目录
os.walk()方法:
返回三个元素的元组,(dirpath,dirnames,filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
操作:使用walk()递归遍历所有文件和目录
#测试os.walk()递归遍历所有的子目录和子文件
import os
all_files = []
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files:
for dir in dirnames:
all_files.append(os.path.join(dirpath,dir))
for file in filenames:
all_files.append(os.path.join(dirpath,file))
#打印所有的子目录和子文件
for file in all_files:
print(file)
运行结果:
递归算法
递归的基本思想就是**”自己调用自己“**,利用递归可以用简单的程序来解决一些复杂的问题。
递归结构包含两个部分:
**1、定义递归头*没有递归头,将陷入死循环,也就是递归的结束条件。
**2、递归体 :就是什么时候需要调用自身方法。
操作1示例:使用递归求n!
#使用递归计算n的阶乘
def factorial(n):
if n==1:
return 1
else:
return n*factorial(n-1)
print(factorial(5))
运行结果:
操作2:#使用递归算法遍历目录下所有文件
#递归打印所有的目录和文件
import os
allfiles = []
def getAllFiles(path,level):
childFiles = os.listdir(path)
for file in childFiles:
filepath = os.path.join(path,file)
if os.path.isdir(filepath):
getAllFiles(filepath,level+1)
allfiles.append("\t"*level+filepath)
getAllFiles(os.getcwd(),0)
for f in reversed(allfiles):
print(f)
运行结果:
递归的缺陷:简单的程序是递归的优点之一,但是会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢得多,所以使用递归时要慎用。
文件操作内容学习完成,学习python的第十天,加油!