Python基础学习-文件处理
文件操作(IO操作)
一个完整的程序一般都包括数据的存储和读取;我们在前面写的程序数据都没有进行实际的存储,因此 python 解释器执行完数据就消失了。实际开发中,我们经常需要从外部存储介质(硬盘、光盘、U 盘等)读取数据,或者将程序产生的数据存储到文件中,实现“持久化”保存。
文本文件和二进制文件
按文件中数据组织形式,我们把文件分为文本文件和二进制文件两大类:
- 文本文件
- 文本文件存储的是普通“字符”文本,python 默认为 unicode 字符(两个字节表示一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像 word 软件编辑的文档不是文本文件。
- 二进制文件
- 二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。
文件操作相关模块概述
创建文件对象 open()
open()函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:\a\b.txt。
为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:
f = open(r"d:\b.txt",“w”)
文本文件对象和二进制文件对象的创建:
如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。
文本文件的写入
基本的文件写入操作
文本文件的写入一般就是三个步骤:
- 创建文件对象
- 写入数据
- 关闭文件对象
#文本写入操作简单测试
f=open(r"d:\a.txt","a")
s="leimu\n yxy\n"
f.write(s)
f.close()
os 和 os.path 模块
os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。在系统运维的核心基础。
os 模块-调用操作系统命令
- os.system 可以帮助我们直接调用系统的命令
- os.startfile:直接调用可执行文件
import os
#os.system("notepad.exe") #打开记事本
#os.system("regedit") #打开注册表
#os.system("ping www.baidu.com")
#os.system("cmd")
#测试直接运行程序
os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe")
os 模块-文件和目录操作
我们可以通过前面讲的文件对象实现对于文件内容的读写操作。如果,还需要对文件和目录做其他操作,可以使用 os 和 os.path 模块。
os 模块下常用操作文件的方法
os 模块下关于目录操作的相关方法,汇总如下:
import os
#测试os模块中,关于文件和目录得操作
#############获取文件和文件夹相关的信息################
print(os.name) #windows->nt linux和unix->posix
print(os.sep) #windows->\ linux和unix->/
print(os.linesep)
print(os.stat("test-2.py"))
################关于工作目录的操作##################
#print(os.getcwd())
#os.chdir("d:") #改变当前的工作目录为:d:盘根目录
#os.mkdir("书籍")
#os.rmdir("书籍") #相对路径都是相对于当前的工作目录
#os.makedirs("电影/港台/周星驰")
#os.removedirs("电影/港台/周星驰") #只能删除空目录
#os.makedirs("../音乐/香港/刘德华") #../指的是上一级目录
##################创建目录、创建多级目录、删除##################
#os.rename("电影","moive")
dirs=os.listdir("moive")
print(dirs)
os.path 模块
os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
import os
import os.path
path=os.getcwd() #返回当前工作目录
file_list=os.listdir(path) #列出子目录和子文件
for filename in file_list:
pos = filename.rfind(".") #Python rfind() 返回字符串最后一次出现的位置(从右向左查询),如果没有匹配项则返回-1。
if filename[pos+1:]=="py":
print(filename,end="\n")
print("############################")
file_list2=[filename for filename in os.listdir(path) if filename.endswith(".py")]
for filename in file_list2:
print(filename,end="\n")
walk()递归遍历所有文件和目录
os.walk()方法:
返回一个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:
#print(os.path.join(dirpath,dir))
all_files.append(os.path.join(dirpath,dir))
for file in filenames:
#print(os.path.join(dirpath,file))
all_files.append(os.path.join(dirpath,file))
for file in all_files:
print(file)
shutil 模块(拷贝和压缩)
- shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。
- os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操作,这些 os 模块都没有提供。
#shutil 模块(拷贝和压缩)
import shutil
#shutil.copyfile("b.txt","c.txt")
#shutil.copytree("66/77","电影") #电影目录不存在时才能政策拷贝
shutil.copytree("66/77","电影",ignore=shutil.ignore_patterns("*.txt","*.html"))
import zipfile
#压缩解压
#压缩
z = zipfile.ZipFile("a.zip","w")
z.write("1.txt")
z.write("2.txt")
z.close()
#解压缩
z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d:/") #设置解压的地址
z2.close()
递归算法
- 递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
- 利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。
- 递归结构包括两个部分:
- 定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件。
- 递归体。解答:什么时候需要调用自身方法。
使用递归求 n!
#递归函数计算n的阶乘(5x4x3x2x1)
def factorial(n):
if n==1:
return n
else:
return n*factorial(n-1)
print(factorial(5))
递归打印所有的目录和文件
#递归打印所有的目录和文件
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): #reversed()函数的作用是返回一个反转的迭代器
print(f)
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\电影
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\电影\__init__.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\__init__.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\test-6.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\test-5.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\test-4.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\test-3.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\test-2.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\test-1.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\c.txt
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\b.txt
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\66
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\66\__init__.py
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\66\y.txt
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\66\77
C:\Users\ramon\.PyCharmCE2017.2\config\scratches\-\66\77\__init__.py