2026/4/6 16:14:08
网站建设
项目流程
目录前言第一章文件操作基础1.1 文件操作的核心概念1.2 文件路径详解重点1.2.1 绝对路径1.2.2 相对路径1.3 打开与关闭文件open()函数1.3.1 open()函数语法1.3.2 常用文件打开模式1.3.3 关闭文件close()方法方式1手动关闭不推荐方式2with语句自动关闭推荐第二章文件读写操作核心2.1 文本文件读写最常用2.1.1 读取文件内容方法1read() —— 读取全部内容方法2readline() —— 逐行读取方法3readlines() —— 读取所有行返回列表2.1.2 写入文件内容方法1write() —— 写入字符串方法2writelines() —— 写入可迭代对象列表、元组等2.2 二进制文件读写2.3 文件指针操作第三章目录操作os模块与pathlib模块3.1 os模块与os.path模块传统方式3.1.1 查看当前工作目录3.1.2 切换工作目录3.1.3 创建目录1. 创建单层目录os.mkdir(path)2. 创建多层目录os.makedirs(path, exist_okFalse)3.1.4 删除目录1. 删除空目录os.rmdir(path)2. 删除非空目录shutil.rmtree(path)3.1.5 遍历目录1. 遍历一级目录os.listdir(path)2. 递归遍历所有层级os.walk(path)3.1.6 路径相关判断与处理3.2 pathlib模块面向对象方式推荐3.2.1 创建Path对象3.2.2 路径拼接面向对象方式3.2.3 目录操作Path对象方法3.2.4 文件操作Path对象方法第四章综合案例实战练习案例1批量重命名文件案例2遍历目录并统计文件类型第五章常见问题与最佳实践5.1 常见问题及解决方案5.2 最佳实践第六章总结前言在Python编程中文件和目录操作是最基础且常用的功能之一广泛应用于数据读取、日志记录、批量处理文件、项目目录管理等场景。本教程将从基础概念入手逐步讲解Python中文件的打开与关闭、读写操作以及目录的创建、删除、遍历等核心操作结合大量可直接运行的实例帮助初学者快速掌握相关技能同时补充常见问题和最佳实践满足实际开发需求。本教程适用于Python初学者假设读者已掌握Python基础语法变量、循环、条件判断等。教程中主要使用Python内置模块os、os.path和Python 3.4新增的pathlib模块更简洁、面向对象的操作方式两种方式均会讲解读者可根据习惯选择使用。第一章文件操作基础1.1 文件操作的核心概念文件操作本质是“与计算机存储设备硬盘、U盘等进行数据交互”核心流程分为3步打开文件→操作文件读/写等 →关闭文件。关键注意点打开文件后必须关闭否则会导致资源泄露占用系统文件句柄长期运行可能导致程序崩溃文件路径分为“绝对路径”和“相对路径”避免因路径错误导致操作失败不同操作系统Windows、Linux、Mac的路径分隔符不同Windows用\Linux/Mac用/需注意兼容性。1.2 文件路径详解重点文件路径是找到目标文件的“地址”分为两种类型实际开发中需灵活运用1.2.1 绝对路径从计算机的“根目录”开始完整描述文件的位置无论程序在哪个目录运行都能准确找到文件。示例Windows系统C:\Users\Admin\Desktop\test.txt注意Windows中路径分隔符\需转义或用原始字符串rC:\Users\Admin\Desktop\test.txtLinux/Mac系统/home/user/Desktop/test.txt。1.2.2 相对路径相对于“当前程序运行的目录”即工作目录描述文件的位置简洁高效适合项目内部文件操作。常用相对路径符号.表示当前目录可省略直接写文件名即当前目录下的文件..表示上一级目录./文件夹名/文件名当前目录下的某个文件夹中的文件。示例假设程序在C:\Users\Admin\Desktop目录运行test.txt等价于绝对路径C:\Users\Admin\Desktop\test.txt./data/test.txt等价于C:\Users\Admin\Desktop\data\test.txt../Documents/test.txt等价于C:\Users\Admin\Documents\test.txt。1.3 打开与关闭文件open()函数Python中使用内置函数open()打开文件返回一个“文件对象”通过该对象进行后续的读、写操作操作完成后用close()方法关闭文件。1.3.1 open()函数语法open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone)核心参数重点掌握前4个file必选参数文件路径绝对路径或相对路径mode可选参数文件打开模式决定操作类型如读、写、追加等默认值为r只读encoding可选参数文件编码格式如utf-8、gbk读取中文文件时必须指定否则易出现乱码errors可选参数编码错误处理方式如ignore忽略错误、replace替换错误字符。1.3.2 常用文件打开模式模式说明注意事项r只读模式默认打开已存在的文件文件不存在则报错FileNotFoundErrorw写入模式打开文件后清空原有内容重新写入文件不存在则自动创建文件存在则覆盖内容a追加模式打开文件后在末尾追加内容文件不存在则自动创建不覆盖原有内容r读写模式可读取也可写入文件不存在则报错写入时从当前指针位置开始可能覆盖内容w读写模式先清空原有内容再进行读写文件不存在则自动创建会覆盖原有内容a读写模式在文件末尾追加内容也可读取文件不存在则自动创建读取时需移动指针否则读不到内容rb二进制只读模式用于读取图片、视频等二进制文件不指定encoding参数wb二进制写入模式用于写入图片、视频等二进制文件不指定encoding参数会覆盖原有内容1.3.3 关闭文件close()方法文件操作完成后必须关闭文件释放系统资源。有两种关闭方式方式1手动关闭不推荐# 打开文件 file open(test.txt, r, encodingutf-8) # 执行操作如读取内容 content file.read() # 关闭文件 file.close() # 注意如果操作过程中出现异常close()可能无法执行导致资源泄露方式2with语句自动关闭推荐with语句会自动管理文件资源无论操作是否成功都会在代码块结束后自动关闭文件避免资源泄露是实际开发中的首选方式。# 格式with open(...) as 变量名: with open(test.txt, r, encodingutf-8) as file: # 操作文件缩进内的代码 content file.read() # 代码块结束后文件自动关闭无需手动调用close()第二章文件读写操作核心文件打开后最常用的操作就是“读”和“写”不同打开模式对应不同的读写权限下面分文本文件和二进制文件分别讲解。2.1 文本文件读写最常用文本文件如.txt、.py的读写需指定encoding通常为utf-8避免中文乱码。2.1.1 读取文件内容通过文件对象的3种常用方法读取内容适用于不同场景方法1read() —— 读取全部内容语法file.read(size-1)size为可选参数指定读取的字节数默认值为-1读取全部内容。# 示例读取test.txt的全部内容 with open(test.txt, r, encodingutf-8) as file: # 读取全部内容 content file.read() print(文件全部内容) print(content) # 示例读取前10个字符 with open(test.txt, r, encodingutf-8) as file: content file.read(10) print(前10个字符) print(content)注意read()读取后文件指针会移动到文件末尾再次调用read()会读取到空内容。方法2readline() —— 逐行读取语法file.readline()每次读取一行内容换行符\n会被保留多次调用会依次读取下一行直到文件末尾返回空字符串。# 示例逐行读取文件 with open(test.txt, r, encodingutf-8) as file: # 读取第一行 line1 file.readline() # 读取第二行 line2 file.readline() print(第一行, line1.strip()) # strip()去除换行符和空格 print(第二行, line2.strip())方法3readlines() —— 读取所有行返回列表语法file.readlines()读取文件所有行返回一个列表每一行作为列表的一个元素换行符\n保留。# 示例读取所有行遍历输出 with open(test.txt, r, encodingutf-8) as file: lines file.readlines() print(所有行列表形式, lines) # 遍历列表去除换行符 print(逐行输出) for line in lines: print(line.strip())2.1.2 写入文件内容通过文件对象的write()和writelines()方法写入内容需注意打开模式w/a/r/w/a的区别。方法1write() —— 写入字符串语法file.write(string)写入指定字符串返回写入的字符数若打开模式为w会清空原有内容再写入。# 示例1写入内容覆盖原有内容 with open(test.txt, w, encodingutf-8) as file: count file.write(Python文件操作教程\n) # 写入字符串添加换行符 file.write(第一章文件操作基础) print(f写入的字符数{count}) # 输出16Python文件操作教程\n的长度 # 示例2追加内容不覆盖原有内容 with open(test.txt, a, encodingutf-8) as file: file.write(\n第二章文件读写操作)方法2writelines() —— 写入可迭代对象列表、元组等语法file.writelines(iterable)将可迭代对象中的每个元素字符串写入文件不会自动添加换行符需手动添加。# 示例写入列表内容 lines [第三章目录操作\n, 3.1 目录创建\n, 3.2 目录删除] with open(test.txt, a, encodingutf-8) as file: file.writelines(lines)2.2 二进制文件读写二进制文件如图片.jpg、视频.mp4、音频.mp3的读写需使用二进制模式rb/wb/ab等不指定encoding参数读写的是字节流bytes类型。# 示例1读取图片文件再写入新图片复制图片 # 读取二进制文件 with open(test.jpg, rb) as file: img_data file.read() # 读取图片字节流 # 写入二进制文件复制 with open(test_copy.jpg, wb) as file: file.write(img_data) # 写入字节流 print(图片复制完成)2.3 文件指针操作文件指针是当前读写操作的位置默认情况下以r/rb模式打开文件指针在文件开头以w/wb模式打开文件指针在文件开头同时清空内容以a/ab模式打开文件指针在文件末尾。可通过以下方法操作指针file.tell()返回当前指针的位置字节数file.seek(offset, whence)移动指针到指定位置。seek()参数说明offset偏移量正数表示向后移动负数表示向前移动whence基准位置默认值为0文件开头1当前位置2文件末尾。# 示例操作文件指针 with open(test.txt, r, encodingutf-8) as file: # 读取前5个字符指针移动到第5个字符后 content1 file.read(5) print(读取内容, content1) print(当前指针位置, file.tell()) # 输出5 # 移动指针到文件开头基准0偏移0 file.seek(0, 0) print(移动后指针位置, file.tell()) # 输出0 # 移动指针到当前位置后3个字符基准1偏移3 file.seek(3, 1) print(移动后指针位置, file.tell()) # 输出3 # 移动指针到文件末尾前5个字符基准2偏移-5 file.seek(-5, 2) content2 file.read() print(读取内容, content2)第三章目录操作os模块与pathlib模块目录操作包括创建目录、删除目录、遍历目录、判断目录是否存在等Python提供了os、os.path传统方式和pathlib面向对象方式两种实现方式下面分别讲解。3.1 os模块与os.path模块传统方式os模块提供了与操作系统交互的接口os.path模块专门用于处理文件路径两者结合可完成所有目录操作。使用前需先导入模块import os import os.path3.1.1 查看当前工作目录语法os.getcwd()返回当前程序运行的目录字符串类型。import os # 查看当前工作目录 current_dir os.getcwd() print(当前工作目录, current_dir)3.1.2 切换工作目录语法os.chdir(path)将当前工作目录切换到指定path路径路径不存在则报错。import os # 切换到桌面目录Windows示例 os.chdir(rC:\Users\Admin\Desktop) # 验证切换结果 print(切换后的工作目录, os.getcwd())3.1.3 创建目录分两种场景创建单层目录单个文件夹和创建多层目录嵌套文件夹。1. 创建单层目录os.mkdir(path)import os # 定义目录路径当前工作目录下的test_dir文件夹 dir_path test_dir # 判断目录是否存在不存在则创建 if not os.path.exists(dir_path): os.mkdir(dir_path) print(f目录 {dir_path} 创建成功) else: print(f目录 {dir_path} 已存在)注意os.mkdir()只能创建单层目录若上级目录不存在会报错FileNotFoundError。2. 创建多层目录os.makedirs(path, exist_okFalse)参数exist_ok默认值为False若目录已存在则报错设为True目录已存在时不报错。import os # 定义多层目录路径a/b/c dir_path a/b/c # 创建多层目录目录已存在时不报错 os.makedirs(dir_path, exist_okTrue) print(f多层目录 {dir_path} 创建成功若已存在则忽略)3.1.4 删除目录分两种场景删除空目录和删除非空目录含文件/子目录。1. 删除空目录os.rmdir(path)import os dir_path test_dir # 判断目录是否存在且为空 if os.path.exists(dir_path) and os.path.isdir(dir_path): # 先判断目录是否为空listdir()返回目录内的文件/子目录列表 if len(os.listdir(dir_path)) 0: os.rmdir(dir_path) print(f空目录 {dir_path} 删除成功) else: print(f目录 {dir_path} 非空无法用rmdir删除) else: print(f目录 {dir_path} 不存在)注意os.rmdir()只能删除空目录若目录非空会报错OSError。2. 删除非空目录shutil.rmtree(path)os模块无法直接删除非空目录需使用shutil模块Python内置的rmtree()方法会递归删除目录下的所有文件和子目录谨慎使用不可恢复。import os import shutil dir_path a # 多层目录含子目录和文件 if os.path.exists(dir_path) and os.path.isdir(dir_path): shutil.rmtree(dir_path) print(f非空目录 {dir_path} 及其内容已全部删除) else: print(f目录 {dir_path} 不存在)3.1.5 遍历目录常用两种方法遍历目录下的一级文件/子目录或递归遍历所有层级的文件/子目录。1. 遍历一级目录os.listdir(path)返回指定目录下的所有文件和子目录的名称列表不递归。import os dir_path . # 当前目录 # 遍历一级目录 items os.listdir(dir_path) print(f{dir_path} 目录下的一级内容) for item in items: # 拼接完整路径 item_path os.path.join(dir_path, item) # 判断是文件还是目录 if os.path.isfile(item_path): print(f文件{item}) else: print(f目录{item})2. 递归遍历所有层级os.walk(path)返回一个生成器每次迭代返回一个元组(当前目录路径, 子目录列表, 文件列表)可递归遍历所有子目录。import os dir_path . # 当前目录 # 递归遍历所有层级 for root, dirs, files in os.walk(dir_path): print(f当前目录{root}) print(f 子目录{dirs}) print(f 文件{files}) print(- * 50)3.1.6 路径相关判断与处理os.path模块提供了多个常用函数用于判断路径类型、拼接路径、获取文件名等是实际开发中必备的工具。函数说明示例os.path.exists(path)判断路径文件/目录是否存在返回布尔值os.path.exists(test.txt) → True/Falseos.path.isfile(path)判断路径是否为文件返回布尔值os.path.isfile(test.txt) → Trueos.path.isdir(path)判断路径是否为目录返回布尔值os.path.isdir(test_dir) → Trueos.path.join(path1, path2, ...)拼接多个路径自动适配操作系统的分隔符os.path.join(a, b, test.txt) → a/b/test.txtLinuxos.path.basename(path)获取路径中的文件名含后缀os.path.basename(a/b/test.txt) → test.txtos.path.dirname(path)获取路径中的目录部分os.path.dirname(a/b/test.txt) → a/bos.path.split(path)拆分路径为目录部分文件名返回元组os.path.split(a/b/test.txt) → (a/b, test.txt)os.path.getsize(path)获取文件大小字节数目录返回0os.path.getsize(test.txt) → 1024字节3.2 pathlib模块面向对象方式推荐Python 3.4 新增的pathlib模块采用面向对象的思想将路径封装为“Path对象”操作更简洁、直观无需拼接路径字符串推荐用于Python 3.4以上版本的开发。使用前需导入模块from pathlib import Path3.2.1 创建Path对象Path对象可通过路径字符串创建支持绝对路径和相对路径自动适配操作系统。from pathlib import Path # 创建相对路径对象当前目录下的test.txt file_path Path(test.txt) # 创建绝对路径对象Windows abs_path Path(rC:\Users\Admin\Desktop\test.txt) # 创建目录路径对象 dir_path Path(test_dir) print(相对路径, file_path) print(绝对路径, abs_path) print(路径是否存在, file_path.exists())3.2.2 路径拼接面向对象方式Path对象可通过/斜杠直接拼接路径无需使用os.path.join()更简洁。from pathlib import Path # 拼接路径当前目录 → a → b → test.txt file_path Path(.) / a / b / test.txt print(拼接后的路径, file_path) # 转换为字符串路径必要时 print(字符串路径, str(file_path))3.2.3 目录操作Path对象方法Path对象的方法与os模块功能对应但更简洁下面列出常用操作from pathlib import Path dir_path Path(test_dir) multi_dir_path Path(a/b/c) # 1. 创建目录 dir_path.mkdir(exist_okTrue) # 单层目录已存在不报错 multi_dir_path.mkdir(exist_okTrue, parentsTrue) # parentsTrue表示创建多层目录 # 2. 删除目录 dir_path.rmdir() # 删除空目录非空报错 # 删除非空目录需结合shutil模块 import shutil shutil.rmtree(multi_dir_path) # 3. 查看当前工作目录 current_dir Path.cwd() print(当前工作目录, current_dir) # 4. 切换工作目录需结合os模块Path无直接方法 import os os.chdir(current_dir / test_dir) # 5. 遍历目录 # 遍历一级目录 for item in dir_path.iterdir(): print(item.name) # 文件名/目录名 if item.is_file(): print(f文件{item}) else: print(f目录{item}) # 递归遍历所有层级类似os.walk() for item in dir_path.glob(**/*): # **/*表示递归所有文件和目录 print(item)3.2.4 文件操作Path对象方法Path对象也可直接用于文件操作与open()函数结合使用更便捷。from pathlib import Path file_path Path(test.txt) # 1. 读取文件内容 with file_path.open(r, encodingutf-8) as file: content file.read() print(文件内容, content) # 2. 写入文件内容 with file_path.open(a, encodingutf-8) as file: file.write(\n使用pathlib操作文件) # 3. 判断文件/目录类型 print(是否为文件, file_path.is_file()) print(是否为目录, file_path.is_dir()) print(文件大小, file_path.stat().st_size) # 获取文件大小字节 print(文件名, file_path.name) # 含后缀 print(文件后缀, file_path.suffix) # 仅后缀如.txt print(文件目录, file_path.parent) # 父目录第四章综合案例实战练习结合前面所学知识完成两个实战案例巩固文件和目录操作的核心技能。案例1批量重命名文件需求将指定目录下的所有.txt文件重命名为“Python_序号_原文件名.txt”如“Python_1_test.txt”。from pathlib import Path # 1. 定义目标目录 dir_path Path(test_files) # 假设该目录下有多个.txt文件 # 2. 判断目录是否存在 if not dir_path.exists() or not dir_path.is_dir(): print(f目录 {dir_path} 不存在或不是目录) else: # 3. 遍历目录下的所有.txt文件按顺序编号 file_list list(dir_path.glob(*.txt)) # 获取所有.txt文件 for index, file in enumerate(file_list, start1): # 4. 拼接新文件名 new_name fPython_{index}_{file.name} # 5. 拼接新路径 new_path dir_path / new_name # 6. 重命名文件rename()方法 file.rename(new_path) print(f重命名{file.name} → {new_name}) print(批量重命名完成)案例2遍历目录并统计文件类型需求递归遍历指定目录统计所有文件的类型按后缀分类并输出每种类型的文件数量。from pathlib import Path # 1. 定义目标目录 dir_path Path(.) # 2. 定义字典用于存储文件类型和数量 file_count {} # 3. 递归遍历所有文件 for item in dir_path.glob(**/*): if item.is_file(): # 只统计文件跳过目录 # 获取文件后缀如.txt、.py统一转为小写 suffix item.suffix.lower() # 若后缀为空无后缀文件记为无后缀文件 if not suffix: suffix 无后缀文件 # 更新字典计数 file_count[suffix] file_count.get(suffix, 0) 1 # 4. 输出统计结果 print(目录文件类型统计) for suffix, count in file_count.items(): print(f{suffix} 文件{count} 个)第五章常见问题与最佳实践5.1 常见问题及解决方案问题1读取中文文件出现乱码 解决方案打开文件时指定encodingutf-8若仍乱码尝试encodinggbkWindows系统部分文件编码为gbk。问题2路径错误导致“FileNotFoundError” 解决方案检查路径是否正确绝对路径/相对路径使用os.path.exists()或Path.exists()判断路径是否存在Windows路径需注意转义用原始字符串r。问题3删除目录时提示“OSError: [WinError 145] 目录不是空的” 解决方案使用shutil.rmtree()删除非空目录谨慎使用不可恢复。问题4写入文件后打开文件看不到内容 解决方案确认打开模式w/a/r等是否正确若使用手动关闭文件需确保close()执行推荐用with语句。5.2 最佳实践始终使用with语句打开文件避免资源泄露路径操作优先使用pathlib模块Python 3.4代码更简洁、可移植操作文件/目录前先使用exists()判断路径是否存在避免报错批量操作文件/目录时加入异常处理try-except提升程序稳定性删除文件/目录时格外谨慎尤其是shutil.rmtree()可先打印操作内容确认无误后再执行。第六章总结本教程详细讲解了Python文件及目录操作的核心知识点包括文件操作路径概念、open()函数、文件打开模式、读写方法、文件指针操作目录操作os模块、os.path模块、pathlib模块的常用方法创建、删除、遍历实战案例批量重命名文件、文件类型统计巩固所学知识常见问题与最佳实践帮助避免踩坑提升开发效率。文件和目录操作是Python开发的基础技能建议多动手练习结合实际场景灵活运用两种操作方式os模块和pathlib模块逐步掌握核心技巧。后续可结合异常处理、批量处理等需求进一步拓展相关功能。