2020/06/03 文件操作(IO操作)
文本文件和二进制文件
- 文本文件:存储的是普通“字符”文本,默认为Unicode字符集(两个字节表示一个字符),可以使用记事本程序打开。
- 二进制文件:把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4视频文件,JPG图片,doc文档等。
文件操作相关模块概述:
名称 | 说明 |
io模块 | 文件流的输入和输出操作 |
os模块 | 基本操作系统功能,包括文件操作 |
glob模块 | 查找符合特定规则的文件路径名 |
fnmatch模块 | 使用模式来匹配文件路径名 |
fileinput模块 | 处理多个输入文件 |
filecmp模块 | 用于文件的比较 |
cvs模块 | 用于cvs文件处理 |
pickle和cPickle | 用于序列化和反序列化 |
xml包 | 用于XML数据处理 |
创建文件对象open()
open()函数用于创建文件对象,基本语法格式:open(文件名[,打开方式])
打开方式有如下几种:
模式 | 描述 |
r | 读模式 |
w | 写模式,如果文件不存在则创建;如果文件存在,则重写新内容。 |
a | 追加模式,如果文件不存在,则创建;如果文件存在,则在文件末尾追加内容 |
b | 二进制模式 |
+ | 读、写模式 |
文本文件的写入:
基本的文件写入操作:一般就是三个步骤:1. 创建文件对象;2. 写入数据 3. 关闭文件对象
write()和writelines():前者把字符串写入到文件中,猴子将字符串列表写入到文件中,不添加换行符。
close()关闭文件流
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用close()方法关闭文件对象。为了确保打开的文件对象正常关闭,一般结合异常几种的finally或者with关键字实现无论何种情况都能关闭打开的问价对象。
try:
f = open(r"a.txt","w")
strs = ["xiaoming\n","xiaohong\n"]
f.write(strs)
except BaseException as e:
print(e)
finally:
f.close()
with上下文管理器:
with关键字可以自动管理上下文资源,不论什么愿意跳出with块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
with open(r"d.txt","a") as f:
f.write("xiaoming","i love you")
文本文件的读取:
文件的读取一般使用如下三个方法:
- read([size]):从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件。读取到文件末尾,会返回空字符串。
- readline():读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
- readlines():文本文件中,每一行作为一个字符串存入列表中,返回该列表。
with open("a.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("a.txt","w",encoding="utf-8") as f: f.writelines(lines)
二进制文件的读取和写入,我们需要指定二进制模式,从而创建出二进制文件对象,使用"wb"、"ab"、"rb"等。
with open("a.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(3)
"""#seek(offset[,whence])把文件指针移动到新的位置,offset表示相对于whence的多少个字节
#偏移量,
offset:off为正往结束方向移动,为负往开始方向运动
whence有三个值:
0从文件头开始计算(默认值)
1:从当前位置开始计算
2:从文件尾开始计算"""
print("读取的内容:{0}".format(str(f.readline())))
使用pickle序列化
Python中,一切皆对象,对象本质上就是一个“存储数据的内存块”。对象的序列化机制广泛的应用在分布式、并行系统上。
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
序列化我们使用:
pickle.dump(obj,file) obj就是要被序列化的对象,file指的是存储的文件
pickle.load(file) 从file读取数据,反序列化成对象
os和os.path模块
os模块可以帮助我们直接对操作系统进行操作。可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等。
os调用操作系统文件和命令:
-
os.system可以直接调用系统的命令
import os
#os.system("notepad.exe")
os.system("regedit")
- os模块-文件和目录操作
os模块下常用操作文件的方法:
方法名 | 描述 |
remove(path) | 删除指定文件 |
rename(src,dest) | 重命名文件或目录 |
stat(path) | 返回文件的所有属性 |
lisrdir(path) | 返回path目录下的文件和目录列表 |
os模块下关于目录操作的相关方法:
方法名 | 描述 |
mkdir(path) | 创建目录 |
makedirs(path1/path2/path3...) | 创建多级目录 |
rmdir(path) | 删除目录 |
removeddirs(path1/path2...) | 删除多级目录 |
getcwd() | 返回当前工作目录:current work dir |
chdr(path) | 把path设为当前工作目录 |
walk() | 遍历目录树 |
sep | 当前操作系统所使用的路径分隔符 |
#coding=utf-8
import os
##################获取文件和文件夹相关信息########################
print(os.name) #windows->nt linux->posix
print(os.sep) #window->\ linux->/
print(repr(os.linesep)) #windows->\r\n linux->\n\
print(os.stat("ex1.py"))
print(os.getcwd())
####################关于工资目录的操作######################
#os.mkdir("book")
#os.rmdir("b.txt")
#####################创建目录、创建多目录、删除#####################
#os.makedirs("booka/note/nu")
os.removedirs("booka/note/nu") #只能删除空目录
os.rename("book","but")
dirs = os.listdir("book")
print(dirs)
##########################################
os.path模块
os.path模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
方法 | 描述 |
isabs(path) | 判断path是否绝对路径 |
isdir(path) | 判断path是否为目录 |
isfile(path) | 判断path是否为文件 |
exists(path) | 判断指定路径的文件是否存在 |
getsize(filename) | 返回文件的大小 |
abspath(path) | 返回绝对路径 |
dirname(path) | 返回目录的路径 |
getatime(filename) | 返回问价的最后访问时间 |
getmtime(filename) | 返回文件的最后修改时间 |
walk(top,func,arg) | 递归方式遍历目录 |
join(path,*path) | 连接多个path |
split(path) | 对路径进行分割,以列表形式返回 |
splitext(path) | 从路径中分割文件的扩展名 |
#coding=utf-8
#列出工作目录下所有的.py文件,并输出文件名
import os
import os.path
path = os.getcwd()
file_list = os.listdir(path)
for filename in file_list:
if filename.endswith("py"):
print(filename)
print("######################")
#列表推导式
file_list2 = [filename for filename in os.listdir(path) if filename.endswith("py")]
for f in file_list2:
print(f)
walk()递归遍历所有文件和目录
os.wallk()方法:
返回一个3个元素的元组,(dirpath,dirnames,filenames),dirpath:列出指定目录的路径;dirnames:目录下的所有文件夹;filenames:目录下的所有文件。
#测试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)
shutil模块(拷贝和压缩)
shutil模块是Python标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等,还可以做文件和文件夹的压缩、解压缩操作。
#coding=utf-8
#测试shutil模块的用法:拷贝、压缩
import shutil
import zipfile
shutil.copyfile("1.txt","1_copy.txt")
shutil.copytree("movie/港台","电影") #电影目录不存在时才能实现正常的拷贝
shutil.copytree("movie/港台","电影",ignore=shutil.ignore_patterns("*.txt"))
shutil.make_archive("book/notebook","zip","书籍/笔记本")
z1 = zipfile.ZipFile("a.zip","w")
z1.write("1.txt")
z1.close()
z2 = zipfile.ZipFile("d:/z.zip","r")
z2.extractall("电影")
z2.close()
递归算法
递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”。递归结构包括两个部分:
- 定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件。
- 递归体。解答:什么时候需要调用自身方法。
#conding=utf-8
#测试递归方法
#使用递归求n!
def factoria(n):
if n == 1:
return n
else:
return n*factoria(n-1)
print(factoria(5))