一、操作文件路径
1.获取当前路径
os.getcwd ():获取当前工作目录
当前工作目录是程序执行时默认的文件操作基准目录。使用os.getcwd()函数可以返回当前工作目录的字符串路径。
import os
current_dir = os.getcwd()
print("当前工作目录:", current_dir)
2.创建文件夹
在 Python 的 os 库中,mkdir和makedirs是用于创建目录的两个重要函数。虽然它们的核心功能都是创建目录,但在使用场景和行为特性上存在明显差异。
os.mkdir函数的主要功能是创建单个目录。
os.mkdir 的使用示例:
import os
# 示例1:创建单个目录(父目录存在)
try:
# 假设当前工作目录下已存在"projects"目录
os.mkdir("projects/new_project")
print("单个目录创建成功")
except FileExistsError:
print("目录已存在")
except FileNotFoundError:
print("父目录不存在")
# 示例2:创建目录时父目录不存在(会抛出异常)
try:
# 假设"nonexistent_parent"目录不存在
os.mkdir("nonexistent_parent/subdir")
except FileNotFoundError:
print("父目录不存在,创建失败")
在示例 1 中,由于 "projects" 目录已存在,os.mkdir成功创建了 "new_project" 子目录;示例 2 中,因为 "nonexistent_parent" 目录不存在,函数抛出FileNotFoundError异常。
os.makedirs函数的主要功能是递归创建多级目录。
os.makedirs 的使用示例:
import os
# 示例1:创建多级目录(父目录不存在)
try:
os.makedirs("data/reports/2024/q1")
print("多级目录创建成功")
except FileExistsError:
print("目录已存在")
# 示例2:设置exist_ok=True处理目录已存在的情况
try:
# 假设"docs/tutorials"目录已存在
os.makedirs("docs/tutorials/basics", exist_ok=True)
print("目录创建成功或已存在")
except FileExistsError:
print("目录已存在(此句不会执行,因exist_ok=True)")
示例 1 中,"data"、"reports"、"2024" 等父目录可能原本不存在,但os.makedirs会自动依次创建这些父目录,最终成功创建 "q1" 目录;示例 2 中,由于设置了exist_ok=True,当 "docs/tutorials" 目录已存在时,函数不会抛出异常,而是直接创建 "basics" 子目录(若不存在)或正常返回(若已存在)。
3.拼接路径:
在处理多层目录时,手动拼接路径容易因操作系统的路径分隔符不同而出现错误。os 库提供了专门的函数来处理路径的拼接与拆分。
os.path.join (path1, path2, ...):拼接路径
os.path.join()函数能将多个路径组件拼接成一个完整的路径,会根据操作系统自动选择合适的路径分隔符(Windows 用 “\”,Linux/macOS 用 “/”)
示例:
import os
dir_path = "/home/user/data"
file_name = "result.csv"
full_path = os.path.join(dir_path, file_name)
print("拼接后的路径:", full_path) # 输出:/home/user/data/result.csv
4.跳转路径
在 Python 的 os 库中,os.chdir() 函数是用于切换当前工作目录的重要工具。
os.chdir(path) 函数的作用是将当前工作目录切换到指定的 path 路径。
示例代码:
import os
# 假设当前工作目录是 /home/user/project
print("初始工作目录:", os.getcwd()) # 输出:/home/user/project
# 切换到当前目录下的 "data" 子目录(相对路径)
os.chdir("data")
print("切换到 data 后的工作目录:", os.getcwd()) # 输出:/home/user/project/data
# 切换到上一级目录(相对路径 ../ 表示上一级)
os.chdir("..")
print("切换回上一级后的工作目录:", os.getcwd()) # 输出:/home/user/project
# 切换到上一级目录的 "docs" 子目录
os.chdir("../docs")
print("切换到上级 docs 后的工作目录:", os.getcwd()) # 输出:/home/user/docs
5.判断相对路径和绝对路径
在 Python os 库的路径操作函数中,os.path.isabs(path) 是一个用于判断路径是否为绝对路径的实用工具。
os.path.isabs(path) 函数的核心功能是判断传入的 path 参数是否为绝对路径。它返回一个布尔值:若 path 是绝对路径,则返回 True;若为相对路径,则返回 False。
使用示例:
import os
# 绝对路径(盘符开头)
print(os.path.isabs("C:\\Users\\user\\file.txt")) # 输出:True
# 绝对路径(UNC路径)
print(os.path.isabs("\\\\server\\shared\\data")) # 输出:True
# 相对路径(无盘符或UNC前缀)
print(os.path.isabs("data\\report.txt")) # 输出:False
print(os.path.isabs("..\\docs")) # 输出:False
6.获取文件路径和文件名
在 Python os 库的路径处理工具中,os.path.basename(path) 和 os.path.dirname(path) 是一对互补的函数,分别用于从文件路径中提取文件名(或最后一级目录名)和目录路径。无论是解析用户输入的路径、处理文件命名逻辑,还是批量整理文件,这两个函数都能发挥重要作用。
os.path.basename(path) 函数的核心功能是从传入的路径 path 中提取最后一部分内容,通常是文件名(包含扩展名)或最后一级目录的名称,它的返回值是一个字符串。
os.path.dirname(path) 函数则用于提取 path 中除最后一部分外的目录路径,返回值同样是字符串。
当 path 指向具体文件时,basename 提取文件名,dirname 提取文件所在目录的路径,二者组合可完整还原原始路径(忽略尾部分隔符的情况下)。
示例代码:
import os
# Windows 系统示例
file_path_win = "C:\\Users\\user\\docs\\notes.txt"
print("Windows 文件名:", os.path.basename(file_path_win)) # 输出:notes.txt
print("Windows 目录路径:", os.path.dirname(file_path_win)) # 输出:C:\Users\user\docs
二、操作文件和文件夹
1.查询文件大小
os.path.getsize (path):获取文件大小
os.path.getsize(path)函数返回指定文件的大小,单位为字节(B)。若路径是目录,该函数的行为在不同操作系统上可能不同,通常不建议用于目录。
示例代码:
import os
file_path = "images/photo.jpg"
if os.path.isfile(file_path):
file_size = os.path.getsize(file_path)
print("文件大小:", file_size, "字节")
2.删除文件和文件夹
os.rmdir (path) :删除目录
os.rmdir(path)函数用于删除空目录,若目录非空则会抛出异常。
示例代码:
import os
# 删除空目录
try:
os.rmdir("empty_dir")
print("空目录删除成功")
except OSError:
print("删除空目录失败,目录可能非空或不存在")
# 递归删除目录
try:
os.removedirs("data/temp/empty")
print("递归删除目录成功")
except OSError:
print("递归删除目录失败")
3.重命名文件或文件夹
在 Python 的 os 库中,os.rename() 和 os.renames() 是用于重命名文件或目录的两个重要函数。它们不仅能实现简单的名称修改,还能在重命名的同时移动文件或目录,在文件管理和批量处理场景中经常用到。
os.rename (src, dst):重命名或移动文件 / 目录
os.rename(src, dst) 函数的主要功能是将 src 指向的文件或目录重命名为 dst,也可以实现文件或目录的移动(若 src 和 dst 位于不同目录)。
示例:
import os
# 原目录路径
src_dir = "data/temp"
# 目标目录路径(移动到上级目录并改名)
dst_dir = "data/temporary"
try:
os.rename(src_dir, dst_dir)
print(f"目录重命名/移动成功:{src_dir} → {dst_dir}")
except OSError as e:
print(f"目录操作失败:{e}")
os.renames (old, new):递归重命名或移动文件 / 目录
os.renames(old, new) 函数可以视为 os.rename() 的增强版,它支持递归创建目标路径中不存在的父目录,从而实现更复杂的移动和重命名操作。
示例 :
import os
# 原目录路径
old_dir = "files/docs"
# 目标路径(父目录 "backup/docs_2024" 不存在)
new_dir = "backup/docs_2024/old_docs"
try:
os.renames(old_dir, new_dir)
print(f"目录重命名并移动成功:{old_dir} → {new_dir}")
except OSError as e:
print(f"操作失败:{e}")
4.复制文件
在 Python 的 os 库中,os.link() 函数是用于创建硬链接的重要工具。硬链接作为文件系统中的一种特殊链接方式,能为文件创建多个入口,方便文件的管理和访问。
5.获取文件夹中的全部文件名
os.link(src, dst) 函数的核心功能是为 src 指向的文件创建一个硬链接,硬链接的路径为 dst。硬链接与原文件共享相同的 inode(文件系统中的索引节点),这意味着它们指向存储介质上的同一数据块,修改其中一个会影响所有关联的硬链接。
示例 :
import os
# 源文件路径(需确保文件存在)
src_file = "data/report.txt"
# 硬链接路径
link_file = "data/report_link.txt"
try:
os.link(src_file, link_file)
print(f"硬链接创建成功:{src_file} → {link_file}")
except FileNotFoundError:
print(f"错误:源文件 {src_file} 不存在")
except PermissionError:
print(f"错误:没有权限创建硬链接 {link_file}")
except OSError as e:
print(f"创建硬链接失败:{e}")
6.判断文件和文件夹
os.path.exists (path):判断路径是否存在
os.path.exists(path)函数用于检查指定的路径是否存在,存在则返回 True,否则返回 False。
示例代码:
import os
path1 = "data"
path2 = "nonexistent_file.txt"
print("path1是否存在:", os.path.exists(path1)) # 若存在data目录则返回True
print("path2是否存在:", os.path.exists(path2)) # 通常返回False
os.path.isfile (path) 与 os.path.isdir (path):判断是文件还是目录
os.path.isfile(path)函数判断路径是否为一个文件,os.path.isdir(path)函数判断路径是否为一个目录,返回值均为布尔类型。
示例代码:
import os
file_path = "docs/guide.pdf"
dir_path = "docs"
print("是否为文件:", os.path.isfile(file_path)) # 若存在该文件则返回True
print("是否为目录:", os.path.isdir(dir_path)) # 若存在该目录则返回True
三、执行其他应用程序
在 Python 编程中,除了处理文件和数据,有时还需要调用外部应用程序来完成特定任务,比如打开记事本、运行脚本或执行系统命令等。本文将详细介绍在 Python 中通过命令提示符 / 终端、os.system()方法和os.popen()方法执行其他应用程序的具体方式,帮助你灵活应对不同的外部程序调用场景。
1.命令提示符窗口或终端
- Windows 系统:打开 “命令提示符”(Win+R 输入cmd回车),输入应用程序的路径或名称即可启动。例如:
- 启动记事本:notepad.exe(系统自带程序可直接输入名称,因路径已加入环境变量)
- 启动指定路径的程序:"C:\Program Files\Google\Chrome\Application\chrome.exe"(路径含空格需用引号包裹)
2.system()方法
os.system(command)是 Python 中最基础的调用外部程序的方法,它通过操作系统的命令行执行command参数指定的命令,并返回命令的退出状态码(0 表示成功,非 0 表示失败)。
语法与参数
import os
status = os.system(command)
command:字符串类型,需执行的系统命令或应用程序启动指令。
返回值:整数类型的退出状态码,0 表示执行成功,其他值表示出错(具体含义因命令而异)。
示例 :
import os
# 启动Windows记事本
os.system("notepad.exe")
# 启动Linux文本编辑器gedit
# os.system("gedit")
# 启动macOS文本编辑器TextEdit
# os.system("open -a TextEdit")
3.popen()方法
os.popen(command, mode='r', buffering=-1)方法不仅能执行外部命令,还能获取命令的输出结果,它返回一个文件对象,通过该对象可以读取程序的输出内容。
语法与参数
import os
file_obj = os.popen(command, mode='r', buffering=-1)
示例 :
import os
# 执行查看目录内容的命令并获取结果(Windows用dir,Linux/macOS用ls)
if os.name == "nt": # 判断是否为Windows系统
command = "dir"
else:
command = "ls"
# 执行命令并获取输出
with os.popen(command) as f:
output = f.read() # 读取所有输出内容
print("命令执行结果:")
print(output)
ommand:字符串类型,需执行的命令。
mode:文件打开模式,'r'表示读取(默认),'w'表示写入。
buffering:缓冲设置,-1 表示使用默认缓冲。
返回值:文件对象,可通过read()、readlines()等方法读取输出。
四、压缩和解压文件
1.判断文件是否为zip文件
判断一个文件是否为有效的 ZIP 文件,可通过zipfile.is_zipfile()函数实现。该函数会检查文件的头部信息,判断其是否符合 ZIP 文件格式规范,返回布尔值(True表示是 ZIP 文件,False表示不是)。
示例代码:
import zipfile
def is_zip_file(file_path):
"""判断文件是否为有效的ZIP文件"""
try:
return zipfile.is_zipfile(file_path)
except Exception as e:
print(f"判断失败:{e}")
return False
# 测试示例
file1 = "data.zip"
file2 = "document.txt"
print(f"{file1} 是ZIP文件:{is_zip_file(file1)}") # 若为有效ZIP,输出True
print(f"{file2} 是ZIP文件:{is_zip_file(file2)}") # 输出False
2.打开压缩文件
使用zipfile.ZipFile类可打开一个 ZIP 文件,通过指定不同的模式(如读取、写入、追加)实现对 ZIP 文件的操作。常见模式包括:
'r':只读模式(默认),打开已存在的 ZIP 文件。
'w':写入模式,创建新的 ZIP 文件(若文件已存在则覆盖)。
'a':追加模式,向已存在的 ZIP 文件添加新文件。
示例代码:
import zipfile
# 打开已存在的ZIP文件(只读模式)
zip_path = "archive.zip"
try:
with zipfile.ZipFile(zip_path, 'r') as zf:
print(f"成功打开ZIP文件:{zip_path}")
# 后续操作(如查看文件列表)
print("ZIP内包含文件:", zf.namelist())
except FileNotFoundError:
print(f"错误:{zip_path} 不存在")
except zipfile.BadZipFile:
print(f"错误:{zip_path} 不是有效的ZIP文件")
3.解压文件
extract()(解压单个文件)
示例:
import zipfile
import os
zip_path = "archive.zip"
target_dir = "extracted_single" # 解压目标目录
# 创建目标目录(若不存在)
os.makedirs(target_dir, exist_ok=True)
with zipfile.ZipFile(zip_path, 'r') as zf:
# 解压指定文件(如"doc/report.txt")
file_to_extract = "doc/report.txt"
if file_to_extract in zf.namelist():
zf.extract(file_to_extract, path=target_dir)
print(f"已解压 {file_to_extract} 到 {target_dir}")
else:
print(f"ZIP文件中不存在 {file_to_extract}")
4.压缩文件
使用'w'或'a'模式打开ZipFile对象后,可通过write()方法向 ZIP 文件添加文件。
示例代码:
import zipfile
import os
# 创建新的ZIP文件并添加文件(写入模式)
output_zip = "new_archive.zip"
files_to_compress = [
"file1.txt",
"data/results.csv",
"images/pic.jpg"
]
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zf:
for file in files_to_compress:
if os.path.exists(file):
# 写入文件,第二个参数可指定在ZIP中的路径
zf.write(file, arcname=os.path.basename(file)) # 仅保留文件名,不包含原目录结构
print(f"已添加 {file} 到 {output_zip}")
else:
print(f"警告:{file} 不存在,跳过")
5.获取zip文件中文件的属性信息
infolist()方法属于zipfile.ZipFile类,调用该方法会返回一个ZipInfo对象的列表,其中每个ZipInfo对象对应 ZIP 文件中的一个文件或目录,包含了该文件的详细属性信息,如文件名、大小、修改时间、压缩率等。
示例:
import zipfile
import datetime
# 打开ZIP文件
zip_path = "archive.zip"
with zipfile.ZipFile(zip_path, 'r') as zf:
# 获取所有文件的信息列表
file_info_list = zf.infolist()
# 遍历信息列表并输出属性
for info in file_info_list:
print(f"\n文件名称:{info.filename}")
print(f"原始大小:{info.file_size} 字节")
print(f"压缩大小:{info.compress_size} 字节")
print(f"压缩率:{1 - info.compress_size / info.file_size:.2%}")
# 转换修改时间(元组转datetime)
modify_time = datetime.datetime(*info.date_time)
print(f"修改时间:{modify_time.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"是否为目录:{info.is_dir()}")