位置: 文档库 > Python > python3文件的操作实例代码

python3文件的操作实例代码

RogueTempo 上传于 2022-10-25 04:28

《Python3文件的操作实例代码》

文件操作是编程中不可或缺的基础技能,Python3凭借其简洁的语法和强大的标准库,提供了高效的文件处理能力。无论是读取日志、分析数据还是生成报告,掌握文件操作都能显著提升开发效率。本文将通过丰富的实例代码,系统讲解Python3中文件打开、读写、路径处理、异常管理等核心操作,帮助读者快速构建实用的文件处理程序。

一、文件打开与关闭

Python使用内置的open()函数打开文件,该函数返回一个文件对象,通过该对象可进行读写操作。基本语法如下:

file_obj = open(file_path, mode='r', encoding='utf-8')

其中:

  • file_path:文件路径(相对或绝对路径)
  • mode:打开模式(默认'r'表示只读)
  • encoding:字符编码(推荐显式指定)

1.1 常用打开模式

模式 描述
r 只读(默认)
w 写入(覆盖原有内容)
a 追加(在文件末尾添加)
x 独占创建(文件已存在则报错)
b 二进制模式(如rb、wb)
+ 读写模式(如r+、w+)

示例:以不同模式打开文件

# 读取文本文件
with open('demo.txt', 'r', encoding='utf-8') as f:
    content = f.read()

# 写入文件(覆盖)
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write('第一行内容\n')

# 追加内容
with open('output.txt', 'a', encoding='utf-8') as f:
    f.write('追加的第二行\n')

# 二进制模式读取图片
with open('image.jpg', 'rb') as f:
    img_data = f.read()

1.2 使用with语句管理资源

Python的with语句可自动管理文件资源,确保文件在使用后正确关闭,避免资源泄漏:

# 传统方式(需手动close)
f = open('file.txt', 'r')
try:
    data = f.read()
finally:
    f.close()

# 推荐方式(with自动关闭)
with open('file.txt', 'r') as f:
    data = f.read()

二、文件读写操作

2.1 读取文件内容

Python提供多种读取方法:

# 读取整个文件
with open('demo.txt', 'r') as f:
    full_content = f.read()  # 返回字符串

# 逐行读取
with open('demo.txt', 'r') as f:
    for line in f:  # 迭代器方式
        print(line.strip())  # strip()去除换行符

# 读取所有行到列表
with open('demo.txt', 'r') as f:
    lines = f.readlines()  # 返回列表,每个元素为一行

# 读取指定字节数
with open('large_file.bin', 'rb') as f:
    chunk = f.read(1024)  # 每次读取1KB

2.2 写入文件内容

写入操作同样支持多种方式:

# 写入字符串
with open('output.txt', 'w') as f:
    f.write('Hello, World!\n')

# 写入多行(需手动添加换行符)
lines = ['第一行\n', '第二行\n', '第三行\n']
with open('multi_line.txt', 'w') as f:
    f.writelines(lines)  # 注意不会自动添加换行符

# 更简洁的多行写入方式
data = ['Line 1', 'Line 2', 'Line 3']
with open('better_multi.txt', 'w') as f:
    f.write('\n'.join(data))  # 用join合并后写入

2.3 读写混合模式

使用r+w+a+模式可实现读写混合操作:

# r+模式:可读可写,文件必须存在
with open('rw_demo.txt', 'r+', encoding='utf-8') as f:
    content = f.read()  # 先读取
    f.write('\n追加的内容')  # 再写入

# w+模式:可读可写,文件不存在则创建,存在则清空
with open('w_plus.txt', 'w+', encoding='utf-8') as f:
    f.write('初始内容\n')
    f.seek(0)  # 将指针移回文件开头
    print(f.read())  # 读取刚写入的内容

# a+模式:可读可追加,文件不存在则创建
with open('a_plus.txt', 'a+', encoding='utf-8') as f:
    f.write('追加行1\n')
    f.seek(0)
    print(f.read())

三、文件与目录操作

Python的osos.path模块提供了强大的路径操作功能。

3.1 路径处理

import os

# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前目录: {current_dir}")

# 拼接路径(跨平台兼容)
file_path = os.path.join('folder', 'subfolder', 'file.txt')
print(f"完整路径: {file_path}")

# 分解路径
path = '/home/user/docs/report.pdf'
print(os.path.dirname(path))  # /home/user/docs
print(os.path.basename(path))  # report.pdf
print(os.path.splitext(path))  # ('/home/user/docs/report', '.pdf')

# 检查路径是否存在
if os.path.exists('demo.txt'):
    print("文件存在")
else:
    print("文件不存在")

# 检查是文件还是目录
print(os.path.isfile('demo.txt'))  # True/False
print(os.path.isdir('docs'))       # True/False

3.2 目录操作

# 创建目录
os.makedirs('parent/child', exist_ok=True)  # exist_ok避免目录已存在时报错

# 遍历目录内容
for item in os.listdir('.'):  # 列出当前目录内容
    print(item)

# 递归遍历目录树
for root, dirs, files in os.walk('.'):
    print(f"目录: {root}")
    for file in files:
        print(f"  文件: {file}")

# 删除文件
if os.path.exists('temp.txt'):
    os.remove('temp.txt')

# 删除空目录
os.rmdir('empty_dir')

# 递归删除目录(谨慎使用)
import shutil
shutil.rmtree('full_dir')  # 删除目录及其所有内容

四、文件编码与异常处理

4.1 编码问题处理

不同操作系统和文件可能使用不同编码,显式指定编码可避免乱码:

# 常见编码格式
encodings = ['utf-8', 'gbk', 'gb2312', 'big5', 'latin1']

# 尝试多种编码读取
def read_with_fallback(file_path, encodings):
    for enc in encodings:
        try:
            with open(file_path, 'r', encoding=enc) as f:
                return f.read()
        except UnicodeDecodeError:
            continue
    raise ValueError("无法识别的文件编码")

content = read_with_fallback('unknown_encoding.txt', encodings)

4.2 异常管理

文件操作可能引发多种异常,需妥善处理:

try:
    with open('important.txt', 'r') as f:
        data = f.read()
except FileNotFoundError:
    print("错误:文件不存在")
except PermissionError:
    print("错误:没有访问权限")
except UnicodeDecodeError:
    print("错误:文件编码不匹配")
except Exception as e:
    print(f"未知错误: {str(e)}")
else:
    print("文件读取成功")
finally:
    print("文件操作结束")

五、高级文件操作技巧

5.1 内存映射文件

对于大文件,可使用mmap模块实现高效随机访问:

import mmap

with open('large_file.dat', 'r+b') as f:
    # 映射整个文件到内存
    with mmap.mmap(f.fileno(), 0) as mm:
        # 像操作字符串一样操作文件
        print(mm.read(100))  # 读取前100字节
        mm[10:20] = b'REPLACED'  # 修改内容
        mm.flush()  # 写回磁盘

5.2 临时文件处理

使用tempfile模块创建临时文件:

import tempfile

# 创建临时文件(自动删除)
with tempfile.NamedTemporaryFile(mode='w+', delete=True) as tmp:
    tmp.write('临时内容')
    tmp.seek(0)
    print(tmp.read())

# 获取临时目录路径
temp_dir = tempfile.gettempdir()
print(f"系统临时目录: {temp_dir}")

5.3 文件压缩与解压

Python内置gzipzipfile模块支持压缩操作:

import gzip
import zipfile

# 使用gzip压缩
with open('normal.txt', 'rb') as f_in:
    with gzip.open('compressed.gz', 'wb') as f_out:
        f_out.writelines(f_in)

# 解压gzip文件
with gzip.open('compressed.gz', 'rb') as f_in:
    with open('restored.txt', 'wb') as f_out:
        f_out.write(f_in.read())

# 创建zip文件
with zipfile.ZipFile('archive.zip', 'w') as zipf:
    zipf.write('file1.txt')
    zipf.write('file2.txt')

# 解压zip文件
with zipfile.ZipFile('archive.zip', 'r') as zipf:
    zipf.extractall('extracted_files')

六、综合应用案例

6.1 日志文件分析器

def analyze_logs(log_file):
    error_count = 0
    warning_count = 0
    
    with open(log_file, 'r') as f:
        for line in f:
            if 'ERROR' in line:
                error_count += 1
            elif 'WARNING' in line:
                warning_count += 1
    
    report = f"""
    日志分析报告
    ============
    错误数量: {error_count}
    警告数量: {warning_count}
    """
    
    with open('log_report.txt', 'w') as f:
        f.write(report)
    
    return report

analyze_logs('server.log')

6.2 CSV文件处理器

虽然csv模块更专业,但这里展示基础文件操作实现:

def read_csv(file_path):
    data = []
    with open(file_path, 'r', encoding='utf-8') as f:
        headers = f.readline().strip().split(',')
        for line in f:
            row = line.strip().split(',')
            if len(row) == len(headers):
                data.append(dict(zip(headers, row)))
    return data

def write_csv(file_path, data, headers):
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(','.join(headers) + '\n')
        for row in data:
            f.write(','.join(str(row.get(h, '')) for h in headers) + '\n')

# 使用示例
employees = [
    {'name': 'Alice', 'age': 30, 'dept': 'HR'},
    {'name': 'Bob', 'age': 25, 'dept': 'IT'}
]
write_csv('employees.csv', employees, ['name', 'age', 'dept'])
print(read_csv('employees.csv'))

6.3 配置文件读写

import configparser

# 方法1:使用标准文件操作(简单配置)
def write_config(file_path, settings):
    with open(file_path, 'w') as f:
        for section, options in settings.items():
            f.write(f"[{section}]\n")
            for key, value in options.items():
                f.write(f"{key} = {value}\n")
            f.write("\n")

def read_config(file_path):
    config = {}
    current_section = None
    with open(file_path, 'r') as f:
        for line in f:
            line = line.strip()
            if line.startswith('[') and line.endswith(']'):
                current_section = line[1:-1]
                config[current_section] = {}
            elif '=' in line and current_section:
                key, value = line.split('=', 1)
                config[current_section][key.strip()] = value.strip()
    return config

# 方法2:使用configparser模块(更专业)
def configparser_demo():
    conf = configparser.ConfigParser()
    conf['DATABASE'] = {
        'host': 'localhost',
        'port': '5432',
        'user': 'admin'
    }
    with open('config.ini', 'w') as f:
        conf.write(f)
    
    # 读取配置
    conf_read = configparser.ConfigParser()
    conf_read.read('config.ini')
    print(conf_read['DATABASE']['host'])

# 使用示例
settings = {
    'DATABASE': {
        'host': '127.0.0.1',
        'port': '3306',
        'user': 'root'
    },
    'SERVER': {
        'debug': 'True',
        'workers': '4'
    }
}
write_config('settings.cfg', settings)
print(read_config('settings.cfg'))
configparser_demo()

七、最佳实践与性能优化

1. 总是使用with语句管理文件资源

2. 显式指定文件编码(推荐UTF-8)

3. 处理大文件时使用分块读取:

def process_large_file(file_path, chunk_size=1024*1024):  # 1MB块
    with open(file_path, 'rb') as f:
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            # 处理每个数据块
            process_chunk(chunk)

4. 避免频繁的小文件写入,考虑批量操作

5. 使用路径操作函数而非字符串拼接

6. 对关键文件操作添加适当的异常处理

八、总结

Python3提供了强大而灵活的文件操作能力,从基本的读写到高级的内存映射和压缩处理,都能通过标准库高效实现。掌握这些技术后,您可以轻松处理各种文件相关任务,包括日志分析、数据转换、配置管理等。记住始终遵循资源管理的最佳实践,确保代码的健壮性和可维护性。

关键词:Python3文件操作with语句文件读写模式、路径处理、异常管理、内存映射、临时文件、压缩解压、配置文件

简介:本文全面介绍了Python3中的文件操作技术,涵盖文件打开关闭、读写方法、路径处理、异常管理、高级技巧如内存映射压缩解压等内容。通过丰富的实例代码展示了从基础到高级的文件处理实践,帮助开发者掌握高效安全的文件操作方法。