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

Python-文件读写及异常处理

off999 2025-08-06 22:28 22 浏览 0 评论

计算机的文件系统是一种存储和组织计算机数据的方法,它使得对数据的访问和查找变得容易,文件系统使用文件树形目录的抽象逻辑概念代替了硬盘、光盘、闪存等物理设备的数据块概念,用户使用文件系统来保存数据时,不必关心数据实际保存在硬盘的哪个数据块上,只需要记住这个文件的路径和文件名。

实际开发中常常会遇到对数据进行持久化的场景,所谓持久化是指将数据从无法长久保存数据的存储介质(通常是内存)转移到可以长久保存数据的存储介质(通常是硬盘)中。实现数据持久化最直接简单的方式就是通过文件系统将数据保存到文件中。

文件打开和关闭文件

有了文件系统,我们可以非常方便的通过文件来读写数据;在Python中要实现文件操作是非常简单的。我们可以使用Python内置的open函数来打开文件,在使用open函数时,我们可以通过函数的参数指定文件名操作模式字符编码等信息,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件(字符文件或二进制文件)以及做什么样的操作(读、写或追加),具体如下表所示

操作模式

具体含义

'r'

读取 (默认)

'w'

写入(会先截断之前的内容)

'x'

写入,如果文件已经存在会产生异常

'a'

追加,将内容写入到已有文件的末尾

'b'

二进制模式

't'

文本模式(默认)

'+'

更新(既可以读又可以写)

Python的open()函数是文件操作的核心函数,用于打开文件并返回一个文件对象。让我详细解释它的用法:

基本语法:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

主要参数:

  1. file(必需参数)

文件路径,可以是绝对路径或相对路径
可以是字符串或路径对象

  1. mode(模式参数)

文本模式:

'r':只读模式(默认)
'w':写入模式,会覆盖原文件
'a':追加模式,在文件末尾添加内容
'x':创建模式,文件存在时会报错
'r+':读写模式

二进制模式:

'rb':二进制只读
'wb':二进制写入
'ab':二进制追加
'r+b':二进制读写

  1. encoding(编码参数)

指定文本文件的编码格式
常用:'utf-8'、'gbk'、'ascii'等
只在文本模式下有效

  1. buffering(缓冲参数)

-1:系统默认缓冲(默认值)
0:无缓冲(仅二进制模式)
1:行缓冲(仅文本模式)

>1:指定缓冲区大小


手动关闭

# 需要手动关闭
f = open('file.txt', 'r')
content = f.read()
f.close()  # 必须记得关闭

with open()语法

with open() 是Python中安全打开和处理文件的标准方式,它结合了两个重要概念:

1. with语句(上下文管理器)

  • 一种资源管理的语法结构
  • 确保资源被正确获取和释放
  • 自动处理清理工作(如关闭文件)

2. open()函数

  • Python的内置函数,用于打开文件
  • 返回一个文件对象

使用示例 :

基本读取 :

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

# 逐行读取
with open('example.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line.strip())

写入文件 :

# 覆盖写入
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write('Hello, World!')

# 追加写入
with open('output.txt', 'a', encoding='utf-8') as f:
    f.write('\nNew line')

二进制操作 :

# 读取二进制文件
with open('image.jpg', 'rb') as f:
    data = f.read()

# 写入二进制文件
with open('copy.jpg', 'wb') as f:
    f.write(data)

文件基本操作

1、首先创建一个包含诗歌的example.txt文件

# 首先创建一个包含诗歌的example.txt文件
def create_poem_file():
    """创建包含诗歌的example.txt文件"""
    poem = """静夜思
李白

床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。

春晓
孟浩然

春眠不觉晓,
处处闻啼鸟。
夜来风雨声,
花落知多少。

登鹳雀楼
王之涣

白日依山尽,
黄河入海流。
欲穷千里目,
更上一层楼。"""
    # 使用with语句创建文件(推荐方式)
    with open('example.txt', 'w', encoding='utf-8') as f:
        f.write(poem)
    print(" example.txt 文件创建成功!")

2、读取整个文件内容

def read_entire_file():
    """读取整个文件内容"""
    print("\n 读取整个文件内容:")
    print("-" * 40)
    try:
        with open('example.txt', 'r', encoding='utf-8') as f:
            content = f.read()
            print(content)
    except FileNotFoundError:
        print(" 文件不存在,请先运行 create_poem_file()")
    except Exception as e:
        print(f" 读取文件时发生错误:{e}")

3、逐行读取文件

def read_line_by_line():
    """逐行读取文件"""
    print("\n 逐行读取文件:")
    print("-" * 40)
    try:
        with open('example.txt', 'r', encoding='utf-8') as f:
            line_number = 1
            for line in f:
                print(f"第{line_number:2d}行: {line.rstrip()}")
                line_number += 1
    except FileNotFoundError:
        print(" 文件不存在")
    except Exception as e:
        print(f" 读取文件时发生错误:{e}")

4、读取所有行到列表

def read_all_lines():
    """读取所有行到列表"""
    print("\n 读取所有行到列表:")
    print("-" * 40)
    try:
        with open('example.txt', 'r', encoding='utf-8') as f:
            lines = f.readlines()
            print(f"文件共有 {len(lines)} 行")
            print("非空行内容:")
            for i, line in enumerate(lines, 1):
                if line.strip():  # 跳过空行
                    print(f"  {i}: {line.rstrip()}")
    except FileNotFoundError:
        print(" 文件不存在")
    except Exception as e:
        print(f" 读取文件时发生错误:{e}")

5、统计文件信息

def analyze_poem_file():
    """分析诗歌文件的统计信息"""
    print("\n 文件统计信息:")
    print("-" * 40)
    try:
        with open('example.txt', 'r', encoding='utf-8') as f:
            content = f.read()
            lines = content.split('\n')
            
            total_lines = len(lines)
            non_empty_lines = len([line for line in lines if line.strip()])
            total_chars = len(content)
            total_chars_no_space = len(content.replace(' ', '').replace('\n', ''))
            
            print(f"总行数: {total_lines}")
            print(f"非空行数: {non_empty_lines}")
            print(f"总字符数: {total_chars}")
            print(f"总字符数(不含空格换行): {total_chars_no_space}")
            
            # 统计每首诗
            poems = content.split('\n\n')
            print(f"诗歌数量: {len([p for p in poems if p.strip()])}")
            
    except FileNotFoundError:
        print(" 文件不存在")
    except Exception as e:
        print(f" 分析文件时发生错误:{e}")

6、在文件末尾追加内容

def append_to_file():
    """在文件末尾追加新的诗歌"""
    new_poem = """

相思
王维

红豆生南国,
春来发几枝。
愿君多采撷,
此物最相思。"""
    
    print("\n 在文件末尾追加新诗:")
    print("-" * 40)
    try:
        with open('example.txt', 'a', encoding='utf-8') as f:
            f.write(new_poem)
        print(" 成功追加新诗歌到文件末尾")
    except Exception as e:
        print(f" 追加内容时发生错误:{e}")

7、搜索特定内容

def search_in_file(keyword):
    """在文件中搜索包含关键词的行"""
    print(f"\n 搜索包含'{keyword}'的行:")
    print("-" * 40)
    try:
        with open('example.txt', 'r', encoding='utf-8') as f:
            line_number = 1
            found_lines = []
            for line in f:
                if keyword in line:
                    found_lines.append((line_number, line.strip()))
                line_number += 1
            
            if found_lines:
                print(f"找到 {len(found_lines)} 行包含'{keyword}':")
                for line_num, content in found_lines:
                    print(f"  第{line_num}行: {content}")
            else:
                print(f"未找到包含'{keyword}'的行")
                
    except FileNotFoundError:
        print(" 文件不存在")
    except Exception as e:
        print(f" 搜索时发生错误:{e}")

8、 备份文件

def backup_file():
    """创建文件备份"""
    print("\n 创建文件备份:")
    print("-" * 40)
    try:
        # 读取原文件
        with open('example.txt', 'r', encoding='utf-8') as source:
            content = source.read()
        
        # 写入备份文件
        backup_name = 'example_backup.txt'
        with open(backup_name, 'w', encoding='utf-8') as backup:
            backup.write(content)
        
        print(f" 文件已备份为: {backup_name}")
        
    except FileNotFoundError:
        print(" 原文件不存在")
    except Exception as e:
        print(f" 备份文件时发生错误:{e}")

9、主函数演示所有功能

def main():
    """主函数:演示所有文件操作功能"""
    print(" Python诗歌文件操作演示")
    print("=" * 50)
    
    # 创建诗歌文件
    create_poem_file()
    
    # 演示各种读取方式
    read_entire_file()
    read_line_by_line()
    read_all_lines()
    
    # 分析文件
    analyze_poem_file()
    
    # 搜索功能
    search_in_file("月")
    search_in_file("春")
    
    # 追加内容
    append_to_file()
    
    # 重新分析文件(显示追加后的变化)
    print("\n 追加内容后的文件统计:")
    analyze_poem_file()
    
    # 备份文件
    backup_file()
    
    print("\n 演示完成!")

# 运行演示
if __name__ == "__main__":
    main()

异常处理机制

使用Python的异常机制对可能在运行时发生状况的代码进行适当的处理。Python中和异常相关的关键字有五个,分别是try、except、else、finally和raise。

1. 异常处理基础语法

print("\n1. 异常处理基础语法")
print("-" * 40)

# 基本的try-except结构
def basic_exception_handling():
    """基本异常处理示例"""
    print("基本异常处理:")
    try:
        result = 10 / 0  # 这会引发ZeroDivisionError
    except ZeroDivisionError:
        print(" 捕获到除零错误!")
        result = None
    
    return result

basic_exception_handling()

2. 捕获多种异常

# 捕获多种异常
def multiple_exceptions():
    """处理多种异常类型"""
    print("\n处理多种异常:")
    test_cases = [
        lambda: 10 / 0,           # ZeroDivisionError
        lambda: int("abc"),       # ValueError
        lambda: [1, 2][5],        # IndexError
    ]
    
    for i, test_func in enumerate(test_cases):
        try:
            result = test_func()
            print(f"测试{i+1}成功: {result}")
        except ZeroDivisionError:
            print(f"测试{i+1}:  除零错误")
        except ValueError:
            print(f"测试{i+1}:  值错误")
        except IndexError:
            print(f"测试{i+1}:  索引错误")

3. 使用else和finally

# 使用else和finally
def complete_exception_structure():
    """完整的异常处理结构"""
    print("\n完整异常处理结构:")
    
    def test_operation(value):
        try:
            result = 100 / value
            print(f" 计算成功: 100 / {value} = {result}")
        except ZeroDivisionError:
            print(" 不能除以零")
            result = None
        else:
            print(" 没有异常发生,执行else块")
        finally:
            print(" 无论如何都会执行finally块")
        return result
    
    test_operation(5)   # 正常情况
    print()
    test_operation(0)   # 异常情况

complete_exception_structure()

异常结构层次

  1. BaseException - 所有异常的根基类
  2. 四大直接子类
    • SystemExit(系统退出)
    • KeyboardInterrupt(键盘中断)
    • GeneratorExit(生成器退出)
    • Exception(程序异常基类)
  1. Exception的主要分支
    • 算术错误系列
    • 查找错误系列
    • 操作系统错误系列
    • 语法错误系列
    • 值错误系列
    • 警告系列

相关推荐

apisix动态修改路由的原理_动态路由协议rip的配置

ApacheAPISIX能够实现动态修改路由(DynamicRouting)的核心原理,是它将传统的静态Nginx配置彻底解耦,通过中心化配置存储(如etcd)+OpenRest...

使用 Docker 部署 OpenResty Manager 搭建可视化反向代理系统

在之前的文章中,xiaoz推荐过可视化Nginx反向代理工具NginxProxyManager,最近xiaoz还发现一款功能更加强大,界面更加漂亮的OpenRestyManager,完全可以替代...

OpenResty 入门指南:从基础到动态路由实战

一、引言1.1OpenResty简介OpenResty是一款基于Nginx的高性能Web平台,通过集成Lua脚本和丰富的模块,将Nginx从静态反向代理转变为可动态编程的应用平台...

OpenResty 的 Lua 动态能力_openresty 动态upstream

OpenResty的Lua动态能力是其最核心的优势,它将LuaJIT嵌入到Nginx的每一个请求处理阶段,使得开发者可以用Lua脚本动态控制请求的生命周期,而无需重新编译或rel...

LVS和Nginx_lvs和nginx的区别

LVS(LinuxVirtualServer)和Nginx都是常用的负载均衡解决方案,广泛应用于大型网站和分布式系统中,以提高系统的性能、可用性和可扩展性。一、基本概念1.LVS(Linux...

外网连接到内网服务器需要端口映射吗,如何操作?

外网访问内网服务器通常需要端口映射(或内网穿透),这是跨越公网与私网边界的关键技术。操作方式取决于网络环境,以下分场景详解。一、端口映射的核心原理内网服务器位于私有IP地址段(如192.168.x.x...

Nginx如何解决C10K问题(1万个并发连接)?

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。Nginx是大型架构的必备中间件,下面我就全面来详解NginxC10k问题@mikechen文章来源:mikec...

炸场!Spring Boot 9 大内置过滤器实战手册:从坑到神

炸场!SpringBoot9大内置过滤器实战手册:从坑到神在Java开发圈摸爬滚打十年,见过太多团队重复造轮子——明明SpringBoot自带的过滤器就能解决的问题,偏偏要手写几十...

WordPress和Typecho xmlrpc漏洞_wordpress主题漏洞

一般大家都关注WordPress,毕竟用户量巨大,而国内的Typecho作为轻量级的博客系统就关注的人并不多。Typecho有很多借鉴WordPress的,包括兼容的xmlrpc接口,而WordPre...

Linux Shell 入门教程(六):重定向、管道与命令替换

在前几篇中,我们学习了函数、流程控制等Shell编程的基础内容。现在我们来探索更高级的功能:如何控制数据流向、将命令链接在一起、让命令间通信变得可能。一、输入输出重定向(>、>>...

Nginx的location匹配规则,90%的人都没完全搞懂,一张图让你秒懂

刚配完nginx网站就崩了?运维和开发都头疼的location匹配规则优先级,弄错顺序直接导致500错误。核心在于nginx处理location时顺序严格:先精确匹配=,然后前缀匹配^~,接着按顺序正...

liunx服务器查看故障命令有那些?_linux查看服务器性能命令

在Linux服务器上排查故障时,需要使用一系列命令来检查系统状态、日志文件、资源利用情况以及网络状况。以下是常用的故障排查命令,按照不同场景分类说明。1.系统资源相关命令1.1查看CPU使...

服务器被入侵的常见迹象有哪些?_服务器入侵可以被完全操纵吗

服务器被入侵可能会导致数据泄露、服务异常或完全失控。及时发现入侵迹象能够帮助你尽早采取措施,减少损失。以下是服务器被入侵的常见迹象以及相关的分析与处理建议。1.服务器被入侵的常见迹象1.1系统性能...

前端错误可观测最佳实践_前端错误提示

场景解析对于前端项目,生产环境的代码通常经过压缩、混淆和打包处理,当代码在运行过程中产生错误时,通常难以还原原始代码从而定位问题,对于深度混淆尤其如此,因此Mozilla自2011年开始发起并...

8个能让你的Kubernetes集群“瞬间崩溃”的配置错误

错误一:livenessProbe探针“自杀式”配置——30秒内让Pod重启20次现象:Pod状态在Running→Terminating→CrashLoopBackOff之间循环,重启间隔仅...

取消回复欢迎 发表评论: