1

我经常使用下面的两个函数将文件的内容读取到字符串并将字符串写入文件。据我所知,Python 标准库中不存在这些函数,我很好奇为什么。具有高级目录和文件操作的标准库模块shutil没有此功能,我确信这是一个明确的设计选择,不包含它。即我想知道以下内容:

  • 没有将其包含在 Python 标准库中的潜在原因是什么
  • 以这种方式处理文件是否有任何缺点(假设一个人知道整个文件内容将被加载到内存中)

职能

def read_file(path):
    with open(path) as f:
        return f.read()

def write_file(path, data):
    with open(path, 'wb') as f:
        return f.write(data)

为了澄清,我发现以下内容更具可读性

write_file('/tmp/test', 'test')

然后是以下两种选择:

open('/tmp/test', 'wb').write('test')

with open('/tmp/test', 'wb') as f:
    f.write(data)
4

2 回答 2

5

它们都是单行的,你真的不需要它们的功能。

data = open("filename").read()
open("filename", "w").write(data)

至少在 CPython 中,文件将在您执行这些语句后立即关闭,因为您没有保留对文件对象的引用。确保在发生异常时关闭文件并不是真正的问题,尤其是在简单的脚本中。

在其他 Python 实现中,例如 Jython 和 IronPython,这可能会更成问题。如果是,有with(你也可以在一行上写得很清楚):

with open("filename") as f: data = f.read()

如果你发现有像你写的那样的辅助函数更清楚,一定要写它们;他们很清楚。但它们几乎不是必需的,大多数 Python 程序员不会使用它们。

于 2012-10-09T16:44:27.443 回答
2

除了它们都可以在像@Kindall 回答这样的单行中使用......

您的示例传递了许多选项,为特定任务呈现它们。

def read_file(path):
    with open(path) as f:
        return f.read()

Open 需要一些参数。 http://docs.python.org/library/functions.html#open

打开(名称[,模式[,缓冲]])

您还可以通过多种方式读取文件:

根据文件的大小、内容类型以及您想要对其进行的处理——您可能想要进行切换。

像你写的那样拥有“read()”和“write()”函数对于处理小文本文件很有用——但在其他情况下可能会很麻烦。

例如,如果您尝试读取 9GB 的日志文件 - 用您的想法将所有内容读入内存会在大多数当前机器(具有 4-8GB 内存)上导致很多问题。如果该日志文件是二进制格式,那么您在处理数据时会遇到问题。

由于您可以通过链接这些命令使用单行轻松读取/写入文件,因此对我来说,使用另一种更有限的方式来处理文件是没有意义的。

于 2012-10-09T17:17:58.540 回答