0️⃣基础 认识Python操作文件夹(初学者)
python标准库提供了os库来管理操作系统相关功能,无需下载,安装,os库包含丰富的操作文件的方法,可以通过import.os导入库之后使用dir(os)查询获得
(一)操作文件路径
(1.1)获取当前路径
os库中的getcwd0)函数可用于获取当前代码所在文件夹的绝对路径(不包含代码文件名)
import os
print("当前工作目录:", os.getcwd())
(1.2)创建文件夹
os库中有两种用于创建文件夹的函数,分别为mkdir()函数和makedirs()函数
import os
os.mkdir("demo") # 单层
os.makedirs("demo/a/b/c") # 递归多层
.mkdir()函数
在os库中使用mkdir(路径)函数可以实现在路径中创建一个新的文件夹
.makedirs()函数
在os库中makedirs(路径)函数是根据参数来递归创建文件夹,递归表示根据路径创建包含的全部文件夹
因此mkdir()函数和makedirs()函数的区别在于是否可以递归创建文件夹
(1.3)拼接路径
用ospathjoin()方法可以实现将参数拼接为目录路径,从而方便且快速地获取文件地址
import os
full_path = os.path.join("demo", "a", "test.txt")
print("拼接结果:", full_path)
(1.4)跳转路径
如果需要在程序中实现从当前代码所在文件夹路径跳转到其他路径,可以使用os库中的chdir(路径)函数、但要注意路径必须是已经存在的,否则运行代码后会出现报错
import os
os.chdir("demo") # 进入 demo 目录
print("跳转后目录:", os.getcwd())
(1.5)判断相对路径和绝对路径
使用os.path.isabs(path)方法可以判断当前路径是相对路径还是绝对路径
import os
print(os.path.isabs("demo")) # False
print(os.path.isabs("C:\\demo")) # True(Windows)
(1.6)获取文件路径和文件名
os库的patbh模块下的basename(path)方法可用于获取路径中的文件名,dirhame(路径)方法可用手杂路经中的文件夹路径,split(路径)方法可用于将获取的文件夹路径和文件名以元组的形式返回
import os
p = "demo/a/test.txt"
print("文件名:", os.path.basename(p))
print("目录名:", os.path.dirname(p))
print("拆分元组:", os.path.split(p))
(二)操作文件和文件夹
使用os库中的方法实现查询文件大小、删除文件或文件夹、重命名文件或文件夹等操作
(2.1)查询文件大小
使用os库的path模块下的getsize(path)方法可以获取路径中的文件所占用内存的大小,单位为字节
import os
with open("demo/test.txt", "w") as f: # 先随便写点内容f.write("hello")
print("文件大小(字节):", os.path.getsize("demo/test.txt"))
(2.2)删除文件和文件夹
os库中的remove(path)方法可用于删除path中的文件
import os
os.remove("demo/test.txt") # 删除刚创建的文件
(2.3)重命名文件或文件夹
使用os库中的rename()和renames()函数即可实现对文件或文件夹进行重命名。其使用形式如下:
os.rename(src, dst)
os.renames(src,dst)
功能:rename()函数修改指定文件夹或文件的名称,renames()函数递归修改文件夹或文件的名称
参数src:表示要修改的文件夹路径或文件路径
参数dst:表示修改后的文件夹路径或文件路径
import os
os.rename("demo", "demo_new") # 单层改名
os.renames("demo_new/a", "demo_new/x") # 递归改名
(2.4)复制文件
os库中的os.link()函数可用于创建硬链接以实现复制文件。其使用形式如下:
os.link(src,dst)
参数src:表示要修改的文件夹路径或文件路径
参数dst:表示修改后的文件夹路径或文件路径
import os
with open("demo_new/x/source.txt", "w") as f:f.write("copy me")
os.link("demo_new/x/source.txt", "demo_new/x/target.txt")
(2.5)获取文件夹中的全部文件名
使用os库中的listdir(路径)方法即可获取文件夹中的全部文件名(包含文件和文件夹的名称)
在办公领域中,获取文件夹中的全部文件是较为常见的操作,当需要对一系列的文件进行操作时,可以先将这一系列的文件存放在同一个文件夹中,然后通过os.list()方法遍历并获取文件,再对文件进行操作
import os
print("demo_new 下的所有条目:", os.listdir("demo_new"))
(2.6)判断文件和文件夹
os库中提供了以下3种用于判断path是文件还是文件夹的方法
第1种,bs.path.exists(path)。判断path所指的文件或文件夹是否存在,如果存在则返回True,否则返回False
第2种,os.path.isfle(path)。判断path是否为文件,如果是文件则返回True,否则返回False
第3种,bs.path.isdir(path)。判断path是否为文件夹,如果是文件夹则返回True,否则返回False
import os
print("是否存在:", os.path.exists("demo_new"))
print("是文件? ", os.path.isfile("demo_new/x/source.txt"))
print("是目录? ", os.path.isdir("demo_new"))
(三)执行其他应用程序
通过os库中的system()方法实现调用其他代码文件,使得当前代码程序既可执行其他代码文件,又可获取执行后的结果
(3.1)命令提示符窗口或终端
在Windows系统和macOS系统中分别具有命令提示符(cmd)工具和终端工具,其功能是实现在无图形界面的情况下操作计算机。在计算机最初的发展阶段中,计算机并没有带图形界面的操作系统,只能通过命令提示符窗口或终端来启动程序或创建文件。本小节以命令提示符窗口为例来展开介绍如何使用命令。macOs系统终端中使用的命令与命令提示符窗口中使用的相似,读者可以在网络上查阅相关资料
在命令提示符窗口中含有多种可以控制计算机的大部分功能的命令,例如自动重启计算机、定时关机、启动网络、打开应用程序、磁盘操作等。表9-1所示的内容为命令提示符窗口中的部分命令
命令 | 功能描述 |
---|---|
appwiz.cpl | 启动程序和功能 |
cale | 启动计算器 |
control | 启动控制面板 |
shutdown | 自动关机 |
mspaint | 启动画图程序 |
rstrui | 系统还原 |
md | 创建目录 |
regedit.exe | 启动注册表 |
mstsc | 远程桌面连接 |
osk | 启动屏幕键盘 |
copy | 复制文件 |
netstat | 查看网络端口 |
ping | 测试网络连接 |
ftp | 上传文件 |
有了以上对命令提示符窗口和终端的讲解,接下来就可以使用os库中的函数实现与以上命令相同的效果
(3.2)system()方法
os库中的system(命令)方法可用于实现命令提示符窗口的命令或终端的命令
import os
os.system("echo Hello from system") # Windows、macOS、Linux 通用
(3.3)popen()方法
os库中的popen()方法可用于获取执行命令后的结果,获取结果的方法与读取文件的方法类似
import os
with os.popen("dir" if os.name == "nt" else "ls") as p:print(p.read())
(四)压缩和解压文件
Python标准库中的zipfile库可用于处理压缩文件,.zip是一种常用的压缩文件格式。zipfile库中包含用于查看Zip文件、解压Zip文件、将文件压缩为Zip文件等的方法。需要注意的是,在使用zipfile库前需要使用import导入zipfile库
(4.1)判断文件是否为Zip文件
zipfile库中提供了用于判断文件是否为Zip文件的is_zipfile()函数。其使用形式如下:
is_zipfile (flename)
参数filename:表示需要判断的文件的路径
返回值:如果为Zip文件则返回True,否则返回False
import zipfile
print("是 zip 吗?", zipfile.is_zipfile("demo_new.zip"))
将非压缩文件的扩展名修改为.zip会被判断为False
(4.2)打开压缩文件
打开压缩文件可以使用zipfile库中的类ZipFile实现,该类中包含打开、读取、写入、关团和列出Zip文件的方法。类ZipFile的使用形式如下:
ZipFile (fle, mode="r",compression=ZIP STORED, allowZip64=True, compresslevel-None)
参数file:表示需要打开的压缩文件路径和文件名
参数mode:表示打开文件的模式,与open()函数的模式相似,此处打开压缩文件并不是直接解压压缩文件,而是与压缩文件建立联系
import zipfile
with zipfile.ZipFile("demo_new.zip", "w") as z:z.write("demo_new/x/source.txt", arcname="source.txt")z.write("demo_new/x/target.txt", arcname="target.txt")with zipfile.ZipFile("demo_new.zip") as z:print("压缩包内的文件:", z.namelist())
mode分别有'r'、'w'和'a'这3种值
第1种,默认情况下mode为'r',表示对压缩文件有读取权限
第2种,当mode为'W'时,表示对压缩文件有写入权限。当文件不存在时,会创建一个空的压缩文件;当文件存在时,写入的内容会覆盖原来的压缩文件内容
第3种,当mode为'a'时,表示对压缩文件有写入权限。当文件不存在时,会创建一个空的压缩文件;当文件存在时,会在压缩文件内追加内容,而不会覆盖原来的压缩文件内容
参数compression:选择对文件进行压缩的压缩方法,值可以为ZIP_STORED、ZIP_DEFLATED、ZIPBZIP2、ZIP LZMA等
参数allowZip64:当参数值为True时,类ZipFile将在必要时创建带有.zip64扩展名的文件。参数compresslevel:表示压缩级别。当使用ZIP_STORED或ZIP_LZMA压缩方法时,此参数没有作用,当使用ZIP_DEFLATED时,0~9是可以作为参数值的。当使用ZIP_BZIP2时,整数1~9是可以作为参数值的
当需要读取压缩文件中所包含的文件名称时,可以使用namelist()方法
(4.3)解压文件
在zipfile库中解压文件需要使用压缩文件对象中的extract()方法。其使用形式如下:
压缩文件对象.extract(memper,path=lone,pwd=None)
功能:将文件从Zip文件中提取出来(一次提取一个文件)
参数member:表示需要提取的文件名称,其数据类型为字符串类型
参数path:表示是否需要提取到path指定的路径中,其数据类型为字符串类型
参数pwd:若存在密码,则该参数值为密码
import zipfile
with zipfile.ZipFile("demo_new.zip") as z:z.extract("source.txt", path="unzip_result")
(4.4)压缩文件
将文件进行压缩时需要先创建一个压缩文件对象,再依次将需要压缩的文件添加到压缩文件对象中,可使用write()方法来实现。其使用形式如下:
压缩文件对象.write(filename,arcname=None,compress_type=None, compresslevel-None)
参数filename:表示需要添加到压缩文件中的文件名称
参数arcname:表示在压缩文件中的文件名称(默认情况下与filename相同)
参数compress_type:表示压缩类型(ZIP_STORED、ZIP_DEFLATED、ZIP_BZIP2、ZIP_LZMA)
参数compresslevel:表示压缩级别。当使用ZIP_STORED或ZIP_LZMA时,此参数没有作用。当使用ZIP_DEFLATED时,0~9是可以作为参数值的。当使用ZIP_BZIP2时,整数1~9是可以作为参数值的
import zipfile, os
with zipfile.ZipFile("all_demo.zip", "w", zipfile.ZIP_DEFLATED) as z:for root, dirs, files in os.walk("demo_new"):for f in files:full_path = os.path.join(root, f)arc_name = os.path.relpath(full_path, "demo_new")z.write(full_path, arc_name)
使用write()方法添加完文件后,必须使用cose()方法关闭压缩文件,否则文件无法完成压缩
(4.5)获取Zip文件中文件的属性信息
如需获取Zip文件中文件的属性,可以通过infolist()函数来实现,其功能为返回Zip文件中每个文件的属性列表。属性信息由类ZipInfo提供
import zipfile
with zipfile.ZipFile("all_demo.zip") as z:for info in z.infolist():print(info.filename, info.file_size, "bytes")
(五)*sys库
Python标准库中的sys库用于与Python解释器文件进行交互,例如获取Python的版本信息、传递信息到Python代码中等
(5.1)获取Python信息
- 获取 Python 的解释器版本信息
sys库中的version用于获取当前Python的解释器版本号,version_info用于获取解释器的版本信息
- 获取 Python 的其他信息
sys库中还提供了获取Python的其他信息的方法,具体如下:
maxsize属性:获取当前Python支持的对象中包含的最大数据长度
platform属性:获取当前计算机的操作系统
copyright属性:获取当前Python的版权信息
executable属性:获取当前Python解释器在计算机中的目录地址
exec-prefix属性:获取当前Python的安装目录地址
import sys
print("版本:", sys.version)
print("版本元组:", sys.version_info)
print("最大整数值:", sys.maxsize)
print("操作系统:", sys.platform)
print("解释器路径:", sys.executable)
(5.2)退出程序
当代码程序在执行过程中处于某种状态后需要退出时(例如9.5.1小节中的第2个示例代码),可以使用exit()函数。其使用形式如下:
exit(status=None)
参数status:如果值被省略或为None,则默认为0,表示成功退出。如果值为其他整数,则作为系统退出状态。如果是其他信息,则会被当作报错信息输出
import sys
print("准备退出")
sys.exit(0)
(5.3)argv获取输入命令
在讲解pip工具时,介绍了pip的多个参数,例如在命令提示符窗口中执行品5江醒可以获取当前pvthon中已安装的所有第三方库的列表。而pip工具本质上是一个由代码编写而来的程序,那么在使用pip时,list这个参数是如何传递给程序的呢?程序又是如何处理list这个参数的呢?
以上的问题涉及sys库中的argv函数,argv丽数可用于获取用户输入的参数并以列表的形式返回,列表的素引号为0时默认返回当前代码文件所在的目录地址
向argv传递参数的方法与向pip传递参数的方法相同,需要在命令提示符窗口或终端中执行代码文件,即把Python代码文件当作一个程序直接执行,而不是在IDLE中使用菜单栏中的“Run”来执行
在命令提示符窗口中执行代码文件的使用形式如下:
python 代码路径
在执行代码文件时添加参数的使用形式如下:
python 代码路径参数
每个参数之间使用空格隔开
sys.argv可以用于接收执行代码时所传递的参数,之后可以通过代码对参数进行处理
将以下代码保存为 args_demo.py:
import sys
print("收到的参数列表:", sys.argv)
终端执行:
python args_demo.py hello 123
(5.4)stdout,stdin和stderr
sys库中的stdout、stdin和stderr用于显示或获取数据流,其功能分别如下:
- sys.stdout:将信息显示到控制端,print()函数本质上是由sys.stdou封装而成的
- sys.stdin:捕获用户输入的信息,input()函数本质上是由stdin封装而成的
- sys.stderr:输出错误信息,显示效果与代码报错信息相同
import sys
sys.stdout.write("通过 stdout 输出\n")
name = sys.stdin.readline().strip()
sys.stderr.write("你输入的是:" + name + "\n")