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

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

ztj100 2025-07-20 00:04 50 浏览 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#


相关推荐

Linux集群自动化监控系统Zabbix集群搭建到实战

自动化监控系统...

systemd是什么如何使用_systemd/system

systemd是什么如何使用简介Systemd是一个在现代Linux发行版中广泛使用的系统和服务管理器。它负责启动系统并管理系统中运行的服务和进程。使用管理服务systemd可以用来启动、停止、...

Linux服务器日常巡检脚本分享_linux服务器监控脚本

Linux系统日常巡检脚本,巡检内容包含了,磁盘,...

7,MySQL管理员用户管理_mysql 管理员用户

一、首次设置密码1.初始化时设置(推荐)mysqld--initialize--user=mysql--datadir=/data/3306/data--basedir=/usr/local...

Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门

1.1数据库的核心概念在开始Python数据库编程之前,我们需要先理解几个核心概念。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它就像一个电子化的文件柜,能让我们高效...

Linux自定义开机自启动服务脚本_linux添加开机自启动脚本

设置WGCloud开机自动启动服务init.d目录下新建脚本在/etc/rc.d/init.d新建启动脚本wgcloudstart.sh,内容如下...

linux系统启动流程和服务管理,带你进去系统的世界

Linux启动流程Rhel6启动过程:开机自检bios-->MBR引导-->GRUB菜单-->加载内核-->init进程初始化Rhel7启动过程:开机自检BIOS-->M...

CentOS7系统如何修改主机名_centos更改主机名称

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本文将讲解CentOS7系统如何修改主机名。...

前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令

在Linux服务器管理中,SSH(SecureShell)是远程操作的核心工具。以下是SSH终端操作的常用命令和技巧,涵盖连接、文件操作、系统管理等场景:一、SSH连接服务器1.基本连接...

Linux开机自启服务完全指南:3步搞定系统服务管理器配置

为什么需要配置开机自启?想象一下:电商服务器重启后,MySQL和Nginx没自动启动,整个网站瘫痪!这就是为什么开机自启是Linux运维的必备技能。自启服务能确保核心程序在系统启动时自动运行,避免人工...

Kubernetes 高可用(HA)集群部署指南

Kubernetes高可用(HA)集群部署指南本指南涵盖从概念理解、架构选择,到kubeadm高可用部署、生产优化、监控备份和运维的全流程,适用于希望搭建稳定、生产级Kubernetes集群...

Linux项目开发,你必须了解Systemd服务!

1.Systemd简介...

Linux系统systemd服务管理工具使用技巧

简介:在Linux系统里,systemd就像是所有进程的“源头”,它可是系统中PID值为1的进程哟。systemd其实是一堆工具的组合,它的作用可不止是启动操作系统这么简单,像后台服务...

Red Hat Enterprise Linux 10 安装 Kubernetes (K8s) 集群及高级管理

一、前言...

Linux下NetworkManager和network的和平共处

简介我们在使用CentoOS系统时偶尔会遇到配置都正确但network启动不了的问题,这问题经常是由NetworkManager引起的,关闭NetworkManage并取消开机启动network就能正...

取消回复欢迎 发表评论: