如何在 Python 中打开文件时指定缓冲区大小?

2025年1月5日 | 阅读6分钟

引言

Python 的 open() 方法中的 buffering 参数允许您在打开文件时设置缓冲区大小。将数据临时存储在内存中,然后再将其写入或从文件中读取的行为称为缓冲。通过此选项更改任何给定时间的缓冲数据量会影响文件操作的性能和效率。

buffering 参数的可能值

buffering 参数有多个可能的值

  • 如果值为 0,则关闭缓冲。
  • 如果设置为 1,则激活行缓冲,这意味着在每个换行符后将数据刷新到文件。
  • 设置为大于 1 的值,表示以字节为单位的缓冲区大小。对于某些进程,较大的缓冲区大小可以提高 I/O 性能,尤其是在处理大文件或流时。
  • 通过平衡内存使用和 I/O 效率,缓冲区大小配置可以优化文件操作。

使用 open() 函数指定缓冲

Python 中的文件 I/O 缓冲由 open() 函数的 buffering 参数设置。要禁用缓冲,请将其设置为 1,要启用行缓冲,或者设置为正整数以指定以字节为单位的缓冲区大小。禁用缓冲(buffering=0)时可保证即时 I/O,但性能可能会受到影响。对于交互式使用,行缓冲(buffering=1)在每个换行符后刷新。通过降低 I/O 调用频率,较大的缓冲区大小(buffering > 1)可提高性能,尤其是在处理大文件时。处理 Python 中文件的最佳方法是选择一个能够权衡 I/O 效率和内存使用的缓冲区大小。

示例

输出

This is the example Program

说明

代码逐行提取“example.txt”中的文本,去除首尾空格后再打印每一行。Buffering=1 表示行缓冲,它会在每个换行符后刷新缓冲区。这种方法适用于交互式用例,可确保每一行都得到即时处理和显示。单个字节的缓冲区可减少内存使用量,并使实时反馈更容易。可以更改 buffering 参数来微调 I/O 操作并根据需求优化性能。

缓冲模式

无缓冲 (buffering=0)

在“无缓冲”模式 (buffering=0) 下,数据会直接写入或从文件中读取,而无需中间存储。对于实时系统或需要精确 I/O 控制的情况,此模式很有优势。对于时间至关重要的应用程序,它可确保不间断且即时的数据传输。但是,由于会有更多的 I/O 操作,系统开销可能会增加。此模式在需要立即传输数据时很有用,即使它可能导致性能开销。

行缓冲 (buffering=1)

当使用“行缓冲”模式 (buffering=1) 时,数据在被存储在内存中直到遇到换行符后才从文件读取或写入。此模式适用于逐行处理输入并提供即时反馈的交互式程序。行缓冲可确保内存效率并促进实时数据交换。另一方面,处理不带换行符的大量数据可能会导致延迟。它适用于需要即时响应数据或用户输入更改的应用程序。

缓冲区大小 (buffering > 1)

当使用“缓冲区大小”模式 (buffering > 1) 时,通过预先确定的缓冲区大小将数据临时存储在内存中,从而提高了大文件的 I/O 性能。通过调整写入或从文件读取数据之前的缓冲数据量,此模式在内存利用率和 I/O 效率之间取得了平衡。较大的缓冲区大小可通过降低 I/O 操作的频率来提高性能,尤其是在处理大数据集时。另一方面,过大的缓冲区宽度可能会增加内存使用量。优化缓冲区大小对于特定的文件处理需求至关重要。

写入文件时使用自定义缓冲

open() 函数中的 buffering 参数允许您在 Python 中使用自定义缓冲写入文件时设置缓冲区大小。例如,当指定 buffering=4096 时,将分配一个 4096 字节的缓冲区。通过降低向文件执行写操作的频率,可以提高效率,并且对于高效管理大量数据特别有帮助。另一方面,选择过大的缓冲区大小可能会占用过多内存。通过适当的缓冲区大小配置,可以确保 Python 中顺畅高效的文件写入操作,从而在性能需求与高效的系统资源消耗之间取得平衡。

示例

输出

This is the example Program

说明

提供的代码使用 4096 字节的自定义缓冲区从 example.txt 文件中读取数据。它以读取模式('r')打开文件,并使用 for 循环遍历每一行。为了确保清晰的输出,该循环使用 strip() 方法单独处理每一行,该方法会删除任何首尾的空格字符。然后,print() 函数会将每一行打印到控制台。

自定义缓冲区大小可以通过一次限制从文件读取的数据量来平衡内存使用和 I/O 效率,同时优化读取过程。增加缓冲区大小可通过降低 I/O 操作的数量来提高性能,尤其是在处理大文件时。但是,过大的缓冲区可能会占用更多内存。此方法允许最优地利用系统资源,同时在修改文件读取过程以满足个人性能需求方面提供了灵活性。

行缓冲

在计算机编程中,行缓冲是一种用于控制输入和输出流的标准缓冲技术。在使用行缓冲时,数据会保留在缓冲区中,直到遇到换行符。在检测到换行符后,整行数据会被处理或推送到输出流。

此方法特别适用于基于文本的数据或流,在这些数据或流中,逐行操作能获得最佳效果。通过推迟处理或存储数据直到获得完整的一行,有助于优化内存使用。此外,通过允许分批而不是为每个单独的字符处理数据,行缓冲可以降低延迟。

编程语言通常将行缓冲用于文本处理、网络连接协议以及文件输入/输出活动。通过简化输入和输出过程的处理,可以提高代码的可读性和效率,尤其是在处理 CSV 文件、日志文件或文本通信协议等基于文本的数据格式时。

示例

输出

Line 1
Line 2
Line 3

说明

Python 应用程序演示了文件 I/O 操作期间的行缓冲。首先,程序使用写入模式(“w”)的 open() 方法将三行文本写入名为“example.txt”的文件。Python 在写入时使用行缓冲,将每行文本保留,直到遇到换行符(\n)。此方法一次写入整行,以确保有效的数据处理。

接下来,程序使用读取模式(“r”)的 open() 函数从“example.txt”读取数据。通过逐行读取文件,Python 可以一次处理一行。此方法有助于降低延迟和优化内存,尤其是在处理大文件时。最后,为了显示数据已成功检索,从文件中读取的每一行在去除任何尾随的换行符(strip())后都被写入终端。

结论

最后,通过允许开发人员在打开文件时指定缓冲区大小,Python 使他们能够根据特定需求自定义文件 I/O 操作。通过控制缓冲区大小,我们可以最大限度地利用内存,提高性能,并更熟练地处理大型数据集。您可以使用 buffering 选项和 open() 方法来更改 Python 中读写操作的缓冲行为。

请记住,适当的缓冲区大小取决于正在处理的数据类型、文件大小以及可用的 RAM 量。通过仔细选择缓冲区大小,您可以提高 Python 应用程序的速度和效率。