百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

30天学会Python编程:9. Python文件与IO操作

ztj100 2025-07-20 00:04 5 浏览 0 评论

9.1 文件操作基础

9.1.1 文件操作流程

9.1.2 文件打开模式

表9-1 Python文件打开模式

模式

描述

文件存在

文件不存在

'r'

只读

正常打开

报错

'w'

写入

清空内容

创建新文件

'x'

独占创建

报错

创建新文件

'a'

追加

追加写入

创建新文件

'b'

二进制模式

配合使用

-

't'

文本模式(默认)

配合使用

-

'+'

读写模式

配合使用

-

9.2 文件读写操作

9.2.1 基本读写方法

文件对象主要方法

file.read(size)      # 读取size字节内容
file.readline()      # 读取一行
file.readlines()     # 读取所有行到列表
file.write(string)   # 写入字符串
file.writelines()    # 写入字符串序列
file.seek(offset)    # 移动文件指针
file.tell()         # 返回当前指针位置

9.2.2 文本文件操作

# 传统写法
try:
    f = open('data.txt', 'r', encoding='utf-8')
    content = f.read()
finally:
    f.close()

# 推荐写法(上下文管理器)
with open('data.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()
    for line in lines:
        print(line.strip())

9.2.3 二进制文件操作

# 图片复制示例
with open('input.jpg', 'rb') as src, open('output.jpg', 'wb') as dst:
    while True:
        chunk = src.read(1024)  # 分块读取
        if not chunk:
            break
        dst.write(chunk)

9.3 上下文管理器

9.3.1 with语句原理

9.3.2 自定义上下文管理器

class DatabaseConnection:
    """数据库连接上下文管理器"""
    def __enter__(self):
        print("建立数据库连接")
        return self  # 返回资源对象
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("关闭数据库连接")
        if exc_type:  # 处理异常
            print(f"发生错误: {exc_val}")
        return True  # 抑制异常

# 使用示例
with DatabaseConnection() as conn:
    print("执行数据库操作")
    # raise ValueError("模拟错误")  # 测试异常处理

9.4 常见文件格式处理

9.4.1 CSV文件

import csv

# 读取CSV
with open('data.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row['name'], row['age'])

# 写入CSV
data = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]
with open('output.csv', 'w', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=['name', 'age'])
    writer.writeheader()
    writer.writerows(data)

9.4.2 JSON文件

import json

# 写入JSON
data = {'name': 'Alice', 'scores': [88, 92, 95]}
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=2)

# 读取JSON
with open('data.json', 'r', encoding='utf-8') as f:
    loaded = json.load(f)
    print(loaded['name'])

9.4.3 配置文件处理

import configparser

# 写入配置
config = configparser.ConfigParser()
config['DEFAULT'] = {'Server': '192.168.1.1', 'Port': '8080'}
config['USER'] = {'Name': 'Admin'}
with open('config.ini', 'w') as f:
    config.write(f)

# 读取配置
config.read('config.ini')
print(config['USER']['Name'])  # Admin

9.5 目录操作

9.5.1 os模块操作

import os

# 目录遍历
for root, dirs, files in os.walk('.'):
    print(f"当前目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件: {files}")

# 创建目录
os.makedirs('data/temp', exist_ok=True)

9.5.2 pathlib模块(推荐)

from pathlib import Path

# 创建目录
data_dir = Path('data') / 'temp'
data_dir.mkdir(parents=True, exist_ok=True)

# 文件操作
file_path = data_dir / 'test.txt'
file_path.write_text('Hello Pathlib!', encoding='utf-8')
print(file_path.read_text(encoding='utf-8'))

9.6 高级IO操作

9.6.1 内存文件

from io import StringIO, BytesIO

# 文本内存文件
text_buffer = StringIO()
text_buffer.write("Hello ")
text_buffer.write("Memory IO!")
print(text_buffer.getvalue())  # Hello Memory IO!

# 二进制内存文件
bytes_buffer = BytesIO()
bytes_buffer.write(b'\x01\x02\x03')
print(bytes_buffer.getvalue())  # b'\x01\x02\x03'

9.6.2 序列化与反序列化

import pickle

# 对象序列化
data = {'name': 'Alice', 'age': 25}
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

# 反序列化
with open('data.pkl', 'rb') as f:
    loaded = pickle.load(f)
    print(loaded)  # {'name': 'Alice', 'age': 25}

9.7 综合应用举例

案例1:日志分析系统

def analyze_log(log_file):
    """分析日志文件"""
    stats = {
        'total': 0,
        'by_level': {},
        'errors': []
    }
    
    with open(log_file, 'r', encoding='utf-8') as f:
        for line in f:
            stats['total'] += 1
            if 'ERROR' in line:
                level = 'ERROR'
                stats['errors'].append(line.strip())
            elif 'WARN' in line:
                level = 'WARN'
            else:
                level = 'INFO'
            
            stats['by_level'][level] = stats['by_level'].get(level, 0) + 1
    
    # 生成报告
    report = f"""日志分析报告:
总行数: {stats['total']}
级别分布: {stats['by_level']}
错误数量: {len(stats['errors'])}
前3条错误:
"""
    for error in stats['errors'][:3]:
        report += f"- {error}\n"
    
    # 写入报告
    with open('log_report.txt', 'w', encoding='utf-8') as f:
        f.write(report)
    
    return stats

# 使用示例
analyze_log('app.log')

案例2:文件加密工具

import hashlib
from pathlib import Path

def file_checksum(file_path, algorithm='sha256'):
    """计算文件校验和"""
    h = hashlib.new(algorithm)
    with open(file_path, 'rb') as f:
        while chunk := f.read(8192):
            h.update(chunk)
    return h.hexdigest()

def encrypt_file(src, dst, key):
    """简单文件加密"""
    key_hash = hashlib.sha256(key.encode()).digest()
    
    with open(src, 'rb') as s, open(dst, 'wb') as d:
        for i, byte in enumerate(s.read()):
            # 简单异或加密
            encrypted = byte ^ key_hash[i % len(key_hash)]
            d.write(bytes([encrypted]))

# 使用示例
src_file = 'secret.txt'
enc_file = 'secret.enc'
key = "mysecretpassword"

# 加密文件
encrypt_file(src_file, enc_file, key)

# 验证文件完整性
print(f"原始文件校验和: {file_checksum(src_file)}")
print(f"加密文件校验和: {file_checksum(enc_file)}")

9.8 学习路线图

9.9 学习总结

  1. 核心要点
  2. 掌握文件打开模式的区别
  3. 理解上下文管理器原理
  4. 熟悉常见文件格式处理
  5. 掌握安全文件操作实践
  6. 实践建议
  7. 始终使用with语句管理文件
  8. 处理文件指定明确编码
  9. 大文件采用分块读写
  10. 使用pathlib替代os.path
  11. 进阶方向
  12. 异步文件操作(asyncio)
  13. 内存映射文件(mmap)
  14. 文件监控(watchdog)
  15. 压缩文件处理(zip/gzip)
  16. 常见陷阱
  17. 忘记关闭文件导致资源泄漏
  18. 编码不一致导致乱码
  19. 文件路径跨平台问题
  20. 大文件一次性读取内存溢出

持续更新Python编程学习日志与技巧,敬请关注!


#编程# #python# #在头条记录我的2025#


相关推荐

爬取电影视频数据(电影资源爬虫)

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。作者:yangrq1018原文链接:https://segmentfault.com/a/11900...

Python效率倍增的10个实用代码片段

引言Python是一门功能强大且灵活的编程语言,广泛应用于数据分析、Web开发、人工智能等多个领域。它的简洁语法和高可读性让开发者能够快速上手,但在实际工作中,我们常常会遇到一些重复性或繁琐的任务。这...

Python数据处理:深入理解序列化与反序列化

在现代编程实践中,数据的序列化与反序列化是数据持久化、网络通信等领域不可或缺的技术。本文将深入探讨Python中数据序列化与反序列化的概念、实现方式以及数据验证的重要性,并提供丰富的代码示例。...

亿纬锂能:拟向PKL买地,在马来西亚建立锂电池制造厂

亿纬锂能5月12日公告,亿纬马来西亚与PEMAJUKELANGLAMASDN.BHD.(PKL)签订《MEMORANDUMOFUNDERSTANDING》(谅解备忘录),亿纬马来西亚拟向PKL购买标的...

一个超强的机器学习库(spark机器学习库)

简介PyCaret...

30天学会Python编程:9. Python文件与IO操作

9.1文件操作基础9.1.1文件操作流程9.1.2文件打开模式表9-1Python文件打开模式...

Python的Pickle序列化与反序列化(python反序列化json)

动动小手,点击关注...

python进阶突破内置模块——数据序列化与格式

数据序列化是将数据结构或对象转换为可存储/传输格式的过程,反序列化则是逆向操作。Python提供了多种工具来处理不同场景下的序列化需求。一、核心内置模块...

微信聊天记录可视化工具详细介绍(微信聊天记录分析报告小程序)

功能概要能做什么...

Python常用文件操作库使用详解(python中文件操作的相关函数有哪些)

Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能...

Vue3+Django4全新技术实战全栈项目(已完结)

获课》aixuetang.xyz/5739/Django与推荐算法的集成及模型部署实践...

性能调优方面,经常要优化跑的最慢的代码,教你一种快速的方法

在我们遇到性能问题的时候,很多时候需要去查看性能的瓶颈在哪里,本篇文章就是提供了多种常用的方案来监控函数的运行时间。1.time首先说明,time模块很多是系统相关的,在不同的OS中可能会有一些精度差...

Python解决读取excel数据慢的问题

前言:在做自动化测试的时候,我思考了一个问题,就是如果我们的测试用例随着项目的推进越来越多时,我们做自动化回归的时间也就越来越长,其中影响自动化测试速度的一个原因就是测试用例的读取问题。用例越多,所消...

【Python机器学习系列】基于Flask来构建API调用机器学习模型服务

这是我的第364篇...

不会用mmdet工具?速看MMDetection工具的终极指南

来源:计算机视觉工坊添加微信:dddvisiona,备注:目标检测,拉你入群。文末附行业细分群...

取消回复欢迎 发表评论: