小镇的夕阳|知道了这些,您可以使用Python超过99%的文件操作


小镇的夕阳|知道了这些,您可以使用Python超过99%的文件操作处理文件是我们每天最常见的任务之一 。Python具有几个用于执行文件操作的内置模块 , 例如读取文件 , 移动文件 , 获取文件属性等 。 本文总结了您需要了解的许多功能 , 以涵盖Python中最常见的文件操作和良好做法 。
这是您将在本文中看到的模块/功能图 。要了解有关每个操作的更多信息 , 请继续阅读 。
小镇的夕阳|知道了这些,您可以使用Python超过99%的文件操作图1. 由xiaoxu guo 提供
打开和关闭文件当您要读取或写入文件时 , 首先要做的就是打开文件 。Python具有打开的内置函数 , 该函数打开文件并返回文件对象 。文件对象的类型取决于打开文件的模式 。它可以是文本文件对象 , 原始二进制文件和缓冲的二进制文件 。每个文件对象都有诸如read()和write()之类的方法 。
该代码块中有问题 , 您能识别出来吗? 我们将在后面讨论 。
file = open("test_file.txt","w+")file.read()file.write("a new line")Python文档列出了所有可能的文件模式 。表中列出了最常见的模式 。一个重要的规则是 , 任何与w相关的模式都将首先截断该文件(如果存在) , 然后创建一个新文件 。如果您不想覆盖文件 , 请谨慎使用此模式 , 并尽可能使用附加模式 。
mode meaningr打开以供阅读(默认)r+为读取和写入打开(文件指针位于文件的开头)w打开进行写入(如果存在则截断文件)w+可以同时进行读写(截断文件 , 如果存在的话)a开放写操作(如果存在 , 追加到文件末尾 , 并且文件指针位于文件末尾)上一个代码块中的问题是我们只打开了文件 , 但没有关闭文件 。在处理文件时始终关闭文件很重要 。拥有打开的文件对象可能会导致不可预测的行为 , 例如资源泄漏 。有两种方法可以确保正确关闭文件 。
1.使用close()
第一种方法是显式使用close() 。一个好的做法是将其放入最后 , 以便我们可以确保在任何情况下都将关闭该文件 。它使代码更加清晰 , 但另一方面 , 开发人员应该承担责任 , 不要忘记关闭它 。
try:file = open("test_file.txt","w+")file.write("a new line")exception Exception as e:logging.exception(e)finally:file.close()2.使用上下文管理器 , 将open(...)设置为f
第二种方法是使用上下文管理器 。如果您不熟悉上下文管理器 , 那么请查阅Dan Bader用Python编写的上下文管理器和“ with”语句 。与open()一起使用 , 因为f语句实现__enter__和__exit__方法来打开和关闭文件 。此外 , 它将try / finally语句封装在上下文管理器中 , 这意味着我们将永远不会忘记关闭文件 。
with open("test_file","w+") as file:file.write("a new line")这个上下文管理器解决方案是否总是比close()更好? 这取决于您在哪里使用它 。以下示例实现了将50,000条记录写入文件的3种不同方式 。从输出中可以看到 , use_context_manager_2()函数与其他函数相比性能极低 。这是因为with语句在单独的函数中 , 它基本上为每个记录打开和关闭文件 。这种昂贵的I / O操作会极大地影响性能 。
def _write_to_file(file, line):with open(file, "a") as f:f.write(line)def _valid_records():for i in range(100000):if i % 2 == 0:yield idef use_context_manager_2(file):for line in _valid_records():_write_to_file(file, str(line))def use_context_manager_1(file):with open(file, "a") as f:for line in _valid_records():f.write(str(line))def use_close_method(file):f = open(file, "a")for line in _valid_records():f.write(str(line))f.close()use_close_method("test.txt")use_context_manager_1("test.txt")use_context_manager_2("test.txt")# Finished 'use_close_method' in 0.0253 secs# Finished 'use_context_manager_1' in 0.0231 secs# Finished 'use_context_manager_2' in 4.6302 secs


推荐阅读