一、文件操作的核心概念文件路径文件在电脑中的位置如C:\Users\XXX\Desktop\test.txtWindows或/Users/XXX/Desktop/test.txtMac/Linux绝对路径从根目录开始的完整路径相对路径相对于当前程序所在文件夹的路径如./test.txt表示程序同文件夹下的 test.txt文件模式打开文件的方式读、写、追加、二进制等后面会详细讲文件句柄打开文件后返回的 “操作对象”可以理解为 “文件的遥控器”所有操作都通过它完成编码格式文件的字符编码最常用的是utf-8避免中文乱码二、文件操作的基本流程无论哪种文件操作核心流程都是打开文件open → 操作文件读/写/修改 → 关闭文件close重点打开的文件必须关闭否则会占用电脑内存甚至导致文件损坏三、基础操作打开与关闭文件3.1 用open()函数打开文件open()是 Python 内置的打开文件的函数语法文件句柄 open(文件路径, 模式, encoding编码格式)参数作用文件路径字符串类型必填可以是绝对路径或相对路径模式字符串类型可选默认是r决定打开文件的方式encoding字符串类型可选指定文件编码推荐utf-8解决中文乱码常用文件模式模式含义注意事项r只读模式默认文件必须存在否则报错w写入模式文件不存在则创建存在则清空原有内容a追加模式文件不存在则创建新内容追加到文件末尾r读写模式文件必须存在可读可写w写读模式清空原有内容可写可读a追加 读模式新内容追加到末尾可读可写rb二进制只读模式如图片、视频、exe 文件不指定 encoding按字节操作wb二进制写入模式同上3.2 用close()关闭文件打开文件后必须用close()关闭示例# 第一步打开文件桌面的test.txt只读模式utf-8编码 # 注意Windows路径中的\需要转义为\\或用r前缀原始字符串 f open(rC:\Users\XXX\Desktop\test.txt, r, encodingutf-8) # 这里可以加读/写操作 # 第三步关闭文件 f.close()3.3 更安全的方式with语句手动close()容易忘记Python 提供了with语句自动关闭文件即使代码出错也会关闭语法with open(文件路径, 模式, encoding编码格式) as 文件句柄: # 缩进内执行文件操作 # 缩进结束自动关闭文件# 用with打开文件自动关闭 with open(rC:\Users\XXX\Desktop\test.txt, r, encodingutf-8) as f: # 这里写操作代码 content f.read() # 读取文件内容 print(content) # 缩进结束文件已自动关闭无需写f.close()✅ 小白建议所有文件操作优先用 with 语句避免忘记关闭文件的坑四、文件读取操作读取文件是获取文件内容的过程有 4 种常用方法覆盖所有场景4.1 读取全部内容read()语法文件句柄.read(size)size可选指定读取的字节数不写则读取全部适合小文件一次性读入内存# 读取整个文件内容 with open(test.txt, r, encodingutf-8) as f: # 相对路径程序同文件夹 all_content f.read() print(文件全部内容) print(all_content)4.2 按行读取readline()语法文件句柄.readline()每次读取一行内容包括换行符\n适合大文件逐行读节省内存可配合循环使用# 逐行读取文件 with open(test.txt, r, encodingutf-8) as f: # 读取第一行 line1 f.readline() print(第一行, line1) # 输出带换行符所以print后会多一空行 # 读取第二行 line2 f.readline() print(第二行, line2.strip()) # strip()去掉换行符/空格 # 读取第三行 line3 f.readline() print(第三行, line3.strip()) # 读取第四行无内容返回空字符串 line4 f.readline() print(第四行, repr(line4)) # repr显示空字符串输出第一行 Hello Python 第二行 我是文件操作的测试内容 第三行 第3行 第四行 4.3 读取所有行到列表readlines()语法文件句柄.readlines()将文件的每一行作为列表的一个元素返回列表适合需要对每行内容做批量处理的场景with open(test.txt, r, encodingutf-8) as f: lines f.readlines() print(所有行的列表, lines) # 遍历列表处理每行 for i, line in enumerate(lines): # enumerate获取行号内容 print(f第{i1}行{line.strip()})输出所有行的列表 [Hello Python\n, 我是文件操作的测试内容\n, 第3行] 第1行 Hello Python 第2行 我是文件操作的测试内容 第3行 第3行4.4 直接遍历文件句柄最推荐的逐行读取方式语法for line in 文件句柄:逐行读取内存占用最少适合超大文件如 10G 的日志文件代码最简洁# 遍历文件句柄逐行读取最优方式 with open(test.txt, r, encodingutf-8) as f: for line_num, line in enumerate(f, start1): # start1表示行号从1开始 print(f第{line_num}行内容{line.strip()})输出和上面一致但内存效率更高读取的常见问题与解决中文乱码打开文件时指定encodingutf-8如果还是乱码试试gbkWindows 记事本默认编码是 gbk# 解决乱码切换编码 with open(test.txt, r, encodinggbk) as f: print(f.read())文件不存在报错FileNotFoundError检查路径是否正确或先判断文件是否存在五、文件写入操作写入文件是将内容保存到文件的过程核心模式w覆盖、a追加。5.1 覆盖写入w模式⚠️ 重点w模式会清空文件原有内容再写入新内容如果文件不存在会自动创建。语法文件句柄.write(内容)内容必须是字符串类型数字需要转成 strwrite()返回写入的字符数示例 1写入简单内容# 覆盖写入文件不存在则创建 with open(write_test.txt, w, encodingutf-8) as f: # 写入字符串 f.write(这是用w模式写入的内容\n) f.write(第二行内容\n) # 写入数字需转字符串 f.write(str(123456))执行后write_test.txt内容这是用w模式写入的内容 第二行内容 123456示例 2多次写入覆盖原有内容# 第一次写入 with open(write_test.txt, w, encodingutf-8) as f: f.write(第一次写入的内容) # 第二次写入覆盖第一次的内容 with open(write_test.txt, w, encodingutf-8) as f: f.write(第二次写入的内容覆盖了之前的)最终文件内容第二次写入的内容覆盖了之前的5.2 追加写入a模式a模式不会清空原有内容新内容追加到文件末尾文件不存在则创建。# 第一步先写入初始内容 with open(append_test.txt, w, encodingutf-8) as f: f.write(初始内容\n) # 第二步追加内容用a模式 with open(append_test.txt, a, encodingutf-8) as f: f.write(追加的第一行\n) f.write(追加的第二行\n) # 查看最终内容 with open(append_test.txt, r, encodingutf-8) as f: print(f.read())输出初始内容 追加的第一行 追加的第二行5.3 写入多行writelines()如果有一个字符串列表想把每个元素作为一行写入用writelines()# 准备要写入的行列表 lines [ 第一行\n, # 手动加换行符否则会连在一起 第二行\n, 第三行 ] with open(lines_test.txt, w, encodingutf-8) as f: f.writelines(lines)文件内容第一行 第二行 第三行写入的注意事项写入的内容必须是字符串数字、列表等需用str()转换换行需要手动加\n否则所有内容会写在一行w模式慎用确认不需要保留原有内容时再用六、文件的高级操作6.1 检查文件 / 文件夹是否存在避免报错用os模块Python 内置检查路径是否存在避免FileNotFoundErrorimport os # 导入os模块 # 1. 检查文件是否存在 file_path test.txt if os.path.exists(file_path): print(f文件{file_path}存在) else: print(f文件{file_path}不存在) # 2. 检查是否是文件避免路径是文件夹 if os.path.isfile(file_path): print(f{file_path}是文件) # 3. 检查是否是文件夹 folder_path ./test_folder if os.path.isdir(folder_path): print(f{folder_path}是文件夹)6.2 文件重命名与删除用os模块实现文件重命名和删除import os # 1. 重命名文件旧路径新路径 os.rename(old_name.txt, new_name.txt) # 2. 删除文件谨慎使用删除后无法恢复 if os.path.exists(delete_me.txt): # 先检查是否存在 os.remove(delete_me.txt) print(文件已删除) else: print(文件不存在)6.3 文件夹操作import os # 1. 创建文件夹 folder_name new_folder if not os.path.exists(folder_name): os.mkdir(folder_name) # 创建单层文件夹 # os.makedirs(a/b/c) # 创建多层文件夹如a文件夹下的bb下的c # 2. 删除文件夹空文件夹 if os.path.exists(folder_name): os.rmdir(folder_name) # 3. 删除非空文件夹需用shutil模块 import shutil shutil.rmtree(non_empty_folder) # 谨慎使用6.4 二进制文件操作图片 / 视频 / 音频操作图片、视频等二进制文件时用rb/wb模式不指定 encoding# 复制一张图片二进制读取→二进制写入 with open(original.jpg, rb) as f_read: # 二进制只读 img_data f_read.read() # 读取二进制数据 with open(copy.jpg, wb) as f_write: # 二进制写入 f_write.write(img_data) # 写入二进制数据 print(图片复制完成)6.5 文件指针操作移动读取 / 写入位置文件打开后有一个 “指针”光标默认在文件开头读取 / 写入后指针会移动。用seek()手动移动指针with open(test.txt, r, encodingutf-8) as f: # 读取前5个字符 print(f.read(5)) # 输出Hello # 指针现在在第5个字符位置 # 移动指针到文件开头0表示开头2表示末尾 f.seek(0) # 再次读取全部内容 print(f.read()) # 输出完整内容七、实战案例案例 1统计文件的行数和字符数# 统计test.txt的行数、字符数排除空格/换行 file_path test.txt line_count 0 # 行数 char_count 0 # 字符数 with open(file_path, r, encodingutf-8) as f: for line in f: line_count 1 # 每行计数1 # 去掉换行符、空格统计有效字符 clean_line line.strip().replace( , ) char_count len(clean_line) print(f文件总行数{line_count}) print(f文件有效字符数{char_count})案例 2批量修改文件内容替换指定字符串# 将test.txt中的Python替换为Java保存到新文件 with open(test.txt, r, encodingutf-8) as f_read: with open(test_new.txt, w, encodingutf-8) as f_write: for line in f_read: # 替换字符串 new_line line.replace(Python, Java) # 写入新文件 f_write.write(new_line) print(替换完成新文件已保存)案例 3读取大文件避免内存溢出# 读取10G的超大日志文件逐行处理只打印包含error的行 big_file_path big_log.txt error_count 0 with open(big_file_path, r, encodingutf-8) as f: for line in f: # 逐行读取内存只存一行 if error in line.lower(): # 忽略大小写 print(f错误行{line.strip()}) error_count 1 print(f总共找到{error_count}个错误行)八、常见错误与解决方案错误类型原因解决方案FileNotFoundError文件路径错误 / 文件不存在检查路径拼写用os.path.exists()先判断UnicodeDecodeError编码格式不匹配如文件是 gbk用 utf-8 读切换 encodingutf-8/gbkPermissionError没有文件读写权限 / 文件被其他程序占用关闭占用文件的程序检查文件权限IsADirectoryError路径指向文件夹却当作文件操作检查路径是否是文件os.path.isfile()总结核心流程文件操作的基础是打开→操作→关闭优先用with语句自动关闭文件避免内存泄漏核心模式读取用r覆盖写入用w追加写入用a二进制文件用rb/wb核心方法读取用read()小文件/for line in f大文件写入用write()批量写入用writelines()避坑要点写入内容必须是字符串中文乱码指定encodingutf-8w模式会覆盖原有内容需慎用。3.1 读取方法文本文件方法作用适用场景f.read()一次性读取文件全部内容小体积文本文件f.readline()逐行读取单次仅读一行逐行处理、大文件分步读取f.readlines()读取所有行返回字符串列表需批量处理每行内容for line in f:迭代逐行读取内存占用极低超大文本文件、日志文件3.2 写入方法文本文件方法作用注意事项f.write(字符串)写入单行内容需手动加换行符\n仅支持字符串f.writelines(列表)批量写入多行内容列表元素需为字符串换行需手动添加3.3 文件/文件夹管理os模块常用操作操作类型核心语法备注判断路径是否存在os.path.exists(路径)判断文件/文件夹返回布尔值判断是否为文件os.path.isfile(路径)区分文件与文件夹文件重命名os.rename(旧名, 新名)需保证原文件存在删除文件os.remove(文件路径)删除后无法恢复谨慎使用创建文件夹os.mkdir(文件夹名)os.makedirs(路径)创建单层目录可一次性创建多级目录无需逐层级创建删除空文件夹os.rmdir(文件夹名)仅支持删除空目录