0

0

Python文件读写怎么做?简单实用的示例

看不見的法師

看不見的法師

发布时间:2025-08-01 11:57:01

|

500人浏览过

|

来源于php中文网

原创

python文件读写操作的核心步骤是:1. 打开文件;2. 进行读或写操作;3. 关闭文件。推荐使用 with open() 语句,它能自动管理文件关闭,确保资源正确释放。写入文件使用 'w' 模式会覆盖原有内容,追加内容使用 'a' 模式,读取文件使用 'r' 模式。逐行读取或分块读取适用于大文件处理,避免内存溢出。编码方面,utf-8 是首选,但需根据文件来源选择合适编码,防止解码错误。

Python文件读写怎么做?简单实用的示例

Python的文件读写操作,其实远没有一些人想象中那么复杂。核心思路就那么几步:打开文件、进行操作(读或写)、然后关闭文件。而Python之所以被大家喜爱,很大一部分原因就在于它把这些过程封装得非常优雅,尤其是那个

with open()
语句,简直是文件操作的“瑞士军刀”。简单来说,就是用
open()
函数拿到文件对象,然后调用它的方法去读写,最后确保文件被妥善关闭。

Python文件读写怎么做?简单实用的示例

解决方案

Python处理文件读写,最推荐且最常用的模式就是结合

with
语句。这不仅代码简洁,更重要的是它能确保文件在操作完成后,无论是否发生错误,都能被正确关闭,避免资源泄露。

写入文件:

立即学习Python免费学习笔记(深入)”;

Python文件读写怎么做?简单实用的示例

如果你想把一些内容写入到一个新文件,或者覆盖一个已有的文件,可以使用

'w'
模式。

# 写入文本内容到文件
# 如果文件不存在,会创建;如果文件存在,会清空原有内容再写入
try:
    with open('我的第一个文件.txt', 'w', encoding='utf-8') as f:
        f.write("你好,这是我用Python写入的第一行文字。\n")
        f.write("第二行内容也很重要。\n")
        print("内容已成功写入 '我的第一个文件.txt'")
except IOError as e:
    print(f"写入文件时发生错误: {e}")

# 写入多行内容
try:
    lines_to_write = [
        "Python文件操作真是方便!\n",
        "我喜欢这种简洁。\n",
        "希望你也能喜欢。\n"
    ]
    with open('多行文本示例.txt', 'w', encoding='utf-8') as f:
        f.writelines(lines_to_write)
    print("多行内容已成功写入 '多行文本示例.txt'")
except IOError as e:
    print(f"写入多行文件时发生错误: {e}")

如果你想在文件末尾追加内容,而不是覆盖,那就用

'a'
模式:

Python文件读写怎么做?简单实用的示例
# 追加内容到文件末尾
try:
    with open('我的第一个文件.txt', 'a', encoding='utf-8') as f:
        f.write("这是追加的新内容。\n")
        print("新内容已追加到 '我的第一个文件.txt'")
except IOError as e:
    print(f"追加内容时发生错误: {e}")

读取文件:

读取文件通常使用

'r'
模式。

# 读取整个文件内容
try:
    with open('我的第一个文件.txt', 'r', encoding='utf-8') as f:
        content = f.read()
        print("\n--- '我的第一个文件.txt' 的全部内容 ---")
        print(content)
except FileNotFoundError:
    print("'我的第一个文件.txt' 文件未找到。")
except IOError as e:
    print(f"读取文件时发生错误: {e}")

# 逐行读取文件内容(非常推荐,尤其处理大文件时)
try:
    print("\n--- 逐行读取 '我的第一个文件.txt' ---")
    with open('我的第一个文件.txt', 'r', encoding='utf-8') as f:
        for line_num, line in enumerate(f, 1):
            print(f"第 {line_num} 行: {line.strip()}") # .strip() 去除行尾的换行符和空白
except FileNotFoundError:
    print("'我的第一个文件.txt' 文件未找到。")
except IOError as e:
    print(f"逐行读取文件时发生错误: {e}")

# 读取所有行到一个列表中
try:
    with open('多行文本示例.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        print("\n--- '多行文本示例.txt' 的所有行(列表形式)---")
        for i, line in enumerate(lines):
            print(f"列表索引 {i}: {line.strip()}")
except FileNotFoundError:
    print("'多行文本示例.txt' 文件未找到。")
except IOError as e:
    print(f"读取所有行时发生错误: {e}")

为什么推荐使用
with open()
语句?它有什么魔力?

我个人在日常开发中,几乎都会选择

with open()
这种方式来处理文件。这不仅仅是因为它看起来更“Pythonic”,更深层次的原因在于它提供了一种强大的“上下文管理”机制。

想象一下,你打开了一扇门(文件),进去做了一些事情(读写),然后需要确保门被关上,无论你在里面是顺利完成任务,还是不小心摔了一跤(程序报错)。如果门没关,可能会有各种各样的问题,比如其他程序无法访问这个文件,或者系统资源被白白占用。

with open()
的“魔力”就在于,它是一个上下文管理器。当代码执行到
with
语句块的开头时,它会自动调用文件对象的
__enter__
方法,获取文件资源。当代码块执行完毕,无论是正常结束,还是中间抛出了异常,它都会自动调用文件对象的
__exit__
方法。而文件对象的
__exit__
方法,就是用来确保文件被正确关闭的。

Designify
Designify

拖入图片便可自动去除背景✨

下载

这意味着,你不再需要手动写

f.close()
,也不用担心在
try...except...finally
结构中忘记关闭文件,或者因为某个地方的异常导致
finally
块都没执行到。它让文件操作变得更安全、更健壮,同时代码也更加简洁易读。对我来说,这是一种解放,让我可以更专注于业务逻辑,而不是纠结于资源管理这些细节。

处理文件编码:UTF-8 是万能药吗?

说到文件读写,就不得不提编码。这是很多初学者,甚至一些有经验的开发者都会踩坑的地方。我见过太多

UnicodeDecodeError
UnicodeEncodeError
的报错,它们往往都指向同一个问题:编码不匹配。

UTF-8 确实是目前最推荐的编码方式,它能兼容世界上绝大多数语言的字符,包括中文、日文、韩文等等。对于我们创建的新文件,我强烈建议你始终使用

encoding='utf-8'
。这就像给你的文件贴上了一个国际通用的标签,保证了它在不同系统、不同程序之间传输和读取时,都能正确显示内容。

然而,UTF-8 并非“万能药”。它的局限性在于,如果你要处理的文件不是你创建的,而是别人给的,或者是一些历史遗留系统生成的文件,那么它们很可能不是 UTF-8 编码的。例如,在中文环境中,你可能会遇到 GBK、GB2312 甚至 Big5 编码的文件。在某些西方国家,Latin-1(或 ISO-8859-1)也很常见。

这时候,如果你仍然强制用

encoding='utf-8'
去读取一个 GBK 编码的文件,Python 就会因为无法识别这些字节序列而抛出
UnicodeDecodeError
。反之,如果你用 GBK 模式去写入一些只存在于 UTF-8 中的特殊字符,就可能遇到
UnicodeEncodeError

所以,我的建议是:

  1. 明确指定编码: 无论读写,都养成习惯明确指定
    encoding
    参数,不要依赖系统默认编码。因为不同操作系统的默认编码可能不同(比如Windows上可能是GBK,Linux上可能是UTF-8),这会导致你的代码在不同环境下表现不一致。
  2. 了解源文件编码: 如果是读取外部文件,尝试去了解其原始编码。很多文本编辑器(如Notepad++、VS Code)都能显示文件的编码信息。
  3. 错误处理: 当你不确定编码时,可以尝试几种常见的编码,或者使用
    chardet
    这样的第三方库来猜测文件编码(虽然不总是100%准确,但能提供很好的参考)。在读取时,也可以考虑使用
    errors='ignore'
    errors='replace'
    参数来处理无法解码的字符,但这通常意味着你可能会丢失或替换掉部分数据,所以要谨慎使用。

总之,UTF-8 是未来,但兼容历史是现实。理解编码的原理和常见问题,能帮你省去很多调试的烦恼。

读写大文件时,有哪些技巧可以避免内存爆炸?

处理大文件,比如几GB甚至几十GB的日志文件或数据集时,直接使用

f.read()
一次性将所有内容读入内存,几乎肯定会导致内存耗尽,程序崩溃。这时候,我们就需要一些更“聪明”的策略。我的经验告诉我,以下几种方法非常实用:

  1. 逐行迭代(最常用且高效): Python 的文件对象本身就是可迭代的。这意味着你可以直接在

    for
    循环中遍历它,每次只读取一行内容到内存。这是处理文本大文件最推荐的方式。

    # 示例:逐行处理大文件
    # 假设有一个名为 'large_log.txt' 的大文件
    try:
        with open('large_log.txt', 'r', encoding='utf-8') as f:
            for line_num, line in enumerate(f, 1):
                # 这里可以对每一行进行处理,比如解析、筛选、写入另一个文件等
                if "ERROR" in line:
                    print(f"在第 {line_num} 行发现错误: {line.strip()}")
                # 实际应用中,你可能不会直接打印,而是进行更复杂的逻辑
                # 比如将处理后的行写入新文件,或者累加统计数据
    except FileNotFoundError:
        print("大文件 'large_log.txt' 未找到,请创建一个示例文件。")
        # 创建一个模拟的大文件
        with open('large_log.txt', 'w', encoding='utf-8') as f_mock:
            for i in range(100000): # 写入10万行
                f_mock.write(f"这是第 {i+1} 行日志。\n")
                if i % 10000 == 0:
                    f_mock.write(f"ERROR: Something went wrong at line {i+1}!\n")
        print("已创建模拟大文件 'large_log.txt',请重新运行程序。")
    except IOError as e:
        print(f"处理大文件时发生错误: {e}")

    这种方式的优点是内存占用极低,因为它每次只加载一行数据,处理完就释放。

  2. 分块读取

    f.read(size)
    对于二进制文件(如图片、视频)或需要按固定大小块处理的文本文件,可以使用
    f.read(size)
    方法。它会读取指定字节数的内容。

    # 示例:分块读取文件
    # 假设我们要读取一个二进制文件或者按块处理文本
    chunk_size = 4096 # 每次读取4KB
    try:
        with open('binary_data.bin', 'rb') as f_in, open('processed_data.bin', 'wb') as f_out:
            while True:
                chunk = f_in.read(chunk_size)
                if not chunk: # 读取到文件末尾
                    break
                # 在这里处理 chunk,例如解密、压缩、写入新文件等
                f_out.write(chunk) # 简单示例:直接写入到新文件
        print("二进制数据已分块处理并写入 'processed_data.bin'")
    except FileNotFoundError:
        print("二进制文件 'binary_data.bin' 未找到。")
        # 创建一个模拟的二进制文件
        with open('binary_data.bin', 'wb') as f_mock:
            f_mock.write(b'This is some binary data for testing purposes.' * 1000)
        print("已创建模拟二进制文件 'binary_data.bin',请重新运行程序。")
    except IOError as e:
        print(f"分块处理文件时发生错误: {e}")

    这种方式同样能有效控制内存使用,因为它每次只加载一个数据块。

  3. 使用

    f.readline()
    循环:
    for line in f:
    类似,你也可以显式地使用
    while True: line = f.readline(); if not line: break;
    循环来逐行读取。效果上与直接迭代文件对象非常相似,但在某些特定场景下,显式控制可能更清晰。

这些技巧的核心思想都是“流式处理”,即不一次性加载所有数据,而是像水流一样,一点一点地处理。这对于内存有限但数据量巨大的场景至关重要。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

718

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

627

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

744

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1236

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

700

2023.08.11

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号