登录
首页 >  文章 >  python教程

Python文件读写基础教程

时间:2025-07-31 11:00:10 215浏览 收藏

golang学习网今天将给大家带来《Python文件读写入门教程》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习文章或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

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

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

Python的文件读写操作,其实远没有一些人想象中那么复杂。核心思路就那么几步:打开文件、进行操作(读或写)、然后关闭文件。而Python之所以被大家喜爱,很大一部分原因就在于它把这些过程封装得非常优雅,尤其是那个 with open() 语句,简直是文件操作的“瑞士军刀”。简单来说,就是用 open() 函数拿到文件对象,然后调用它的方法去读写,最后确保文件被妥善关闭。

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

解决方案

Python处理文件读写,最推荐且最常用的模式就是结合 with 语句。这不仅代码简洁,更重要的是它能确保文件在操作完成后,无论是否发生错误,都能被正确关闭,避免资源泄露。

写入文件:

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

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

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

说到文件读写,就不得不提编码。这是很多初学者,甚至一些有经验的开发者都会踩坑的地方。我见过太多 UnicodeDecodeErrorUnicodeEncodeError 的报错,它们往往都指向同一个问题:编码不匹配。

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文件读写基础教程》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>