Python文件操作零基础及进阶

一、Python 文件基础操作

不管是读文件、写文件、备份文件,都只用最原始、最好理解的三步骤:

  1. 打开文件 open()
  2. 读 / 写文件
  3. 关闭文件 close()

非常简单、非常好记!


(一)文件打开模式(mode)

模式 意思 用途
r 只读 打开文件看内容
w 只写 新建文件 / 覆盖文件
a 追加 在文件末尾加内容
rb 二进制读 读图片、视频、文件备份
wb 二进制写 写图片、视频、文件备份

(二)文件操作三步骤

  1. 打开文件
python 复制代码
f = open("文件名", "模式", encoding="utf-8")
  1. 读或写
  • 读:
python 复制代码
内容 = f.read()
  • 写:
python 复制代码
f.write("内容")
  1. 关闭文件(非常重要!)
python 复制代码
f.close()

(三)文本文件操作示例

    1. 读文件
python 复制代码
# 1. 打开
f = open('a.txt', mode='r', encoding='utf8')
# 2. 读取
content = f.read()
print(content)
# 3. 关闭
f.close()
    1. 写文件(覆盖)
python 复制代码
# 1. 打开
f = open('a.txt', 'w', encoding='utf8')
# 结果发现,写入中间无空格或换行,可以加\n进行换行
f.write('tina')
f.write('python')
f.close()
    1. 追加文件(不清空,在后面加)
python 复制代码
f = open('a.txt', 'a', encoding='utf8')
f.write('我是追加的内容,open的mode必须改成a\n')
f.write('我是追加的内容,open的mode必须改成a\n')
f.close()

(四)图片/文件备份(最重点)

图片、视频不能用 r/w/a,必须用 rb、wb!

备份逻辑:

  1. 用 rb 打开原文件,读取数据
  2. 用 wb 打开新文件,写入数据
  3. 关闭两个文件
python 复制代码
# 1. 读取原图
# 二进制模式 = 图片、视频、音频, 他们没有编码, 不能加 encoding = 'utf8'
# 我的桌面上有一个鲜花图
pic = open(r'C:\Users\acer\Desktop\flower.jpg', mode='rb')
data = pic.read()
pic.close()
# 2. 写入备份文件
pic2 = open(f'copy_pic.png', 'wb')
pic2.write(data)
pic2.close()
print('备份完成')

(五)一定要加异常处理(让程序不崩溃)

文件最常报的错:

  • FileNotFoundError 文件不存在
  • PermissionError 权限不够
  • Exception 其他错误

健壮版文件备份

python 复制代码
try:
    # 1. 读
    f1 = open("原图.png", "rb")
    data = f1.read()
    f1.close()

    # 2. 写
    f2 = open("备份图.png", "wb")
    f2.write(data)
    f2.close()

    print("备份成功")

except FileNotFoundError:
    print("文件不存在!")

except Exception as e:
    print("出错了:", e)

二、Python文件进阶操作(with open)

(一)语法:with open

好处:自动关闭文件,不会泄露资源,代码更简洁

python 复制代码
with open("文件路径", "模式", encoding="utf8") as f:
    操作代码

(二)最常用 5 大操作

1. 读取文本文件

python 复制代码
with open("a.txt", "r", encoding="utf8") as f:
    content = f.read()  # 一次性读完
print(content)

2. 写入文本(覆盖)

python 复制代码
with open("a.txt", "w", encoding="utf8") as f:
    f.write("hello\n")
    f.write("Python\n")

3. 追加内容(不清空,在后面加)

python 复制代码
with open("a.txt", "a", encoding="utf8") as f:
    f.write("追加的内容\n")

4. 按行读取(适合大文件)

python 复制代码
with open("a.txt", "r", encoding="utf8") as f:
    for line in f:
        print(line.strip())  # 逐行读

5. 二进制读写(图片/视频/备份)

python 复制代码
# 读
with open("flower.png", "rb") as f:
    data = f.read()

# 写
with open("flower.png", "wb") as f:
    f.write(data)

(三)文件备份万能代码

python 复制代码
def copy_file(source, target):
    try:
        with open(source, "rb") as f1, open(target, "wb") as f2:
            f2.write(f1.read())
        print("备份成功!")
    except:
        print("备份失败!")

# 使用
copy_file("原图.png", "备份图.png")

(四)必须掌握的异常处理(健壮代码)

python 复制代码
try:
    with open("a.txt", "r", encoding="utf8") as f:
        print(f.read())
except FileNotFoundError:
    print("文件不存在")
except Exception as e:
    print("出错了:", e)

(五)总结

  1. 操作文件三步:打开 → 读写 → 关闭
  2. 文本用 r/w/a,二进制用 rb/wb
  3. 图片视频必须用二进制
  4. with open 最安全,自动关闭
  5. 读写都要加异常,程序不崩溃
  6. 备份 = 二进制读 + 二进制写

三、os模块针对目录和文件的常用api

在Python编程中,os模块是与操作系统交互的核心工具之一。无论是进行文件管理、目录遍历,还是路径处理,os模块都提供了丰富且实用的API。本文将深入探讨os模块中针对目录和文件的常用操作,帮助你高效地编写文件处理代码。

(一)基础导入与环境检查

在使用os模块之前,首先需要导入它:

python 复制代码
import os

1.1 获取当前工作目录

python 复制代码
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")

1.2 切换工作目录

python 复制代码
os.chdir('/path/to/new/directory')

1.3 获取操作系统信息

python 复制代码
print(f"操作系统名称: {os.name}")  # nt (Windows), posix (Linux/Mac)
print(f"系统版本: {os.uname()}")  # Unix/Linux/Mac专用

(二)路径操作核心API

路径处理是文件操作的基础,os.path子模块提供了强大的路径操作功能。

2.1 路径拼接

推荐方式:自动处理不同操作系统的路径分隔符

python 复制代码
file_path = os.path.join('folder', 'subfolder', 'file.txt')
print(file_path)  # Linux/Mac: folder/subfolder/file.txt, Windows: foldersubfolderfile.txt

2.2 路径分解

python 复制代码
path = '/home/user/documents/report.pdf'

获取目录部分
dir_name = os.path.dirname(path)
print(f"目录: {dir_name}")  # /home/user/documents

获取文件名部分
base_name = os.path.basename(path)
print(f"文件名: {base_name}")  # report.pdf

分割文件名和扩展名
name, ext = os.path.splitext(path)
print(f"文件名(无扩展): {name}")  # /home/user/documents/report
print(f"扩展名: {ext}")  # .pdf

2.3 路径规范化

python 复制代码
规范化路径,处理../和./
normalized = os.path.normpath('/home/user/../user/./documents')
print(normalized)  # /home/user/documents

获取绝对路径
absolute = os.path.abspath('relative/path')
print(absolute)

获取真实路径(解析符号链接)
real = os.path.realpath('/path/with/symlink')
print(real)

(三)目录操作详解

3.1 创建目录

python 复制代码
创建单个目录
os.mkdir('new_folder')

创建多级目录(推荐方式)
os.makedirs('parent/child/grandchild', exist_ok=True)  # exist_ok=True避免已存在时报错

3.2 删除目录

python 复制代码
删除空目录
os.rmdir('empty_folder')

删除非空目录树(谨慎使用!)
import shutil
shutil.rmtree('non_empty_folder')

3.3 目录遍历

python 复制代码
方法一:os.listdir()
列出目录下所有文件和子目录
items = os.listdir('.')
for item in items:
    print(item)

方法二:os.scandir() (Python 3.5+, 更高效)
返回DirEntry对象,包含更多信息且性能更好
with os.scandir('.') as entries:
    for entry in entries:
        print(f"{entry.name}: {'目录' if entry.is_dir() else '文件'}")

方法三:os.walk() (递归遍历)
递归遍历目录树
for root, dirs, files in os.walk('.'):
    print(f"当前目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件: {files}")
    
    # 示例:查找所有.py文件
    for file in files:
        if file.endswith('.py'):
            print(f"找到Python文件: {os.path.join(root, file)}")

3.4 目录判断

python 复制代码
path = 'some_path'

判断是否为目录
if os.path.isdir(path):
    print("这是一个目录")

判断是否存在
if os.path.exists(path):
    print("路径存在")

判断是否为绝对路径
if os.path.isabs(path):
    print("这是绝对路径")

(四)文件操作核心API

4.1 文件状态查询

python 复制代码
file_path = 'example.txt'

获取文件状态信息
stat_info = os.stat(file_path)
print(f"文件大小: {stat_info.st_size} 字节")
print(f"最后修改时间: {stat_info.st_mtime}")
print(f"最后访问时间: {stat_info.st_atime}")

常用便捷函数
print(f"文件大小: {os.path.getsize(file_path)}")
print(f"最后修改时间: {os.path.getmtime(file_path)}")
print(f"最后访问时间: {os.path.getatime(file_path)}")

4.2 文件存在性检查

python 复制代码
检查文件是否存在
if os.path.isfile('data.txt'):
    print("文件存在")
else:
    print("文件不存在")

综合检查
path = 'test_path'
if os.path.exists(path):
    if os.path.isfile(path):
        print("这是一个文件")
    elif os.path.isdir(path):
        print("这是一个目录")

4.3 文件重命名与移动

python 复制代码
重命名文件
os.rename('old_name.txt', 'new_name.txt')

移动文件(跨文件系统也适用)
os.replace('source.txt', 'destination/folder/target.txt')  # Python 3.3+

4.4 文件删除

python 复制代码
删除文件
os.remove('unwanted_file.txt')
或者
os.unlink('unwanted_file.txt')  # 与remove相同

安全删除:先检查再删除
file_to_delete = 'temp.txt'
if os.path.isfile(file_to_delete):
    os.remove(file_to_delete)
    print(f"已删除: {file_to_delete}")

4.5 文件权限操作

python 复制代码
修改文件权限
os.chmod('script.py', 0o755)  # rwxr-xr-x

修改文件所有者(需要管理员权限)
os.chown('file.txt', uid, gid)

检查文件权限
stat_info = os.stat('file.txt')
print(f"权限模式: {oct(stat_info.st_mode)}")

(五)实用技巧与最佳实践

5.1 安全创建临时文件

python 复制代码
import tempfile

创建临时文件
with tempfile.NamedTemporaryFile(delete=False) as tmp:
    tmp.write(b'Hello World')
    temp_path = tmp.name

使用后清理
os.unlink(temp_path)

5.2 批量文件操作示例

python 复制代码
def batch_rename_files(directory, old_ext, new_ext):
    """批量修改文件扩展名"""
    for filename in os.listdir(directory):
        if filename.endswith(old_ext):
            old_path = os.path.join(directory, filename)
            new_filename = filename[:-len(old_ext)] + new_ext
            new_path = os.path.join(directory, new_filename)
            
            if not os.path.exists(new_path):
                os.rename(old_path, new_path)
                print(f"重命名: {filename} -> {new_filename}")
            else:
                print(f"跳过: {new_filename} 已存在")

使用示例
batch_rename_files('./photos', '.jpg', '.jpeg')

5.3 目录大小计算

python 复制代码
def get_directory_size(directory):
    """计算目录总大小"""
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(directory):
        for filename in filenames:
            filepath = os.path.join(dirpath, filename)
            if os.path.isfile(filepath):
                total_size += os.path.getsize(filepath)
    return total_size

使用示例
size = get_directory_size('.')
print(f"当前目录大小: {size / 1024 / 1024:.2f} MB")

5.4 异常处理最佳实践

python 复制代码
import errno

def safe_remove_file(filepath):
    """安全删除文件,处理各种异常情况"""
    try:
        os.remove(filepath)
        print(f"成功删除: {filepath}")
    except FileNotFoundError:
        print(f"文件不存在: {filepath}")
    except PermissionError:
        print(f"权限不足,无法删除: {filepath}")
    except OSError as e:
        if e.errno == errno.EISDIR:
            print(f"这是一个目录,请使用rmdir: {filepath}")
        else:
            print(f"删除失败: {e}")

(六)现代替代方案:pathlib

虽然os模块功能强大,但Python 3.4+引入了pathlib模块,提供了更面向对象的路径操作方式:

python 复制代码
from pathlib import Path

创建路径对象
p = Path('folder') / 'subfolder' / 'file.txt'

检查存在性
if p.exists() and p.is_file():
    print(f"文件大小: {p.stat().st_size}")

遍历目录
for item in Path('.').iterdir():
    print(item.name)

递归查找
python_files = list(Path('.').rglob('*.py'))

建议:新项目优先使用pathlib,但在需要兼容旧代码或特定os功能时,os模块仍然是不可或缺的。

相关推荐
00后程序员张2 小时前
iPhone 无需越狱文件管理 使用Keymob查看导出文件
android·ios·小程序·https·uni-app·iphone·webview
傻啦嘿哟2 小时前
使用 Python 实现 Word 文档文本格式化全解析
开发语言·python·word
2501_921649492 小时前
外汇实时汇率 API | 24 小时 架构设计与实战指南
大数据·python·websocket·金融·restful
badhope2 小时前
Matplotlib实战30例:全类型图表代码库
人工智能·python·plotly·github·matplotlib
老萬頭2 小时前
【技术深水区】抖音 WEB 端逆向:从零到一拿下 a_bogus 参数
前端·爬虫·python
2301_793804692 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
锋风Fengfeng2 小时前
Windows怎么方便查看AOSP代码
android·windows
2501_916008892 小时前
Unity3D iOS 应用防篡改实战 资源校验、 IPA 二进制保护
android·ios·小程序·https·uni-app·iphone·webview
曾阿伦2 小时前
Python 正则表达式备忘录:判断与提取核心用法
python·正则表达式