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

看不見的法師
发布: 2025-08-01 11:57:01
原创
489人浏览过

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__
登录后复制
方法,就是用来确保文件被正确关闭的。

知网AI智能写作
知网AI智能写作

知网AI智能写作,写文档、写报告如此简单

知网AI智能写作 38
查看详情 知网AI智能写作

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

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文件读写怎么做?简单实用的示例的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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