如何在Python中获取小ASCII文件的内容?

45 投票
5 回答
49045 浏览
提问于 2025-04-15 14:21

假设我们想要实现一个和PHP的 file_get_contents 功能相似的东西。

那么,最好的做法是什么呢?(既优雅又可靠)

这里有一些建议,它们是否正确呢?

使用 with 语句:

def file_get_contents(filename):
    with file(filename) as f:
        s = f.read()
    return s

使用标准的 open() 安全么?

def file_get_contents(filename):
    return open(filename).read()

在这两种解决方案中,文件描述符会发生什么?

5 个回答

4

使用with语句其实是确保文件真的被关闭的最好方法。

虽然依赖垃圾回收器的行为可能在某些情况下有效,但在这种情况下,有一种很好的方法可以确保在所有情况下都能做到这一点,所以...

4
import os

def file_get_contents(filename):
  if os.path.exists(filename):
    fp = open(filename, "r")
    content = fp.read()
    fp.close()
    return content

在这种情况下,如果文件不存在,它会返回None,并且在我们退出这个函数之前,文件描述符会被关闭。

58

在当前的CPython实现中,这两种方法通常都会立即关闭文件。不过,Python语言并没有保证第二种方法会立即关闭文件——文件最终会被关闭,但最后的清理工作可能要等到下一个垃圾回收周期才会执行。像Jython和IronPython这样的实现也是这样,所以最好还是明确地关闭你的文件。

我认为使用第一种方法是最佳实践,尽管通常推荐使用open而不是file。不过,如果你喜欢第二种方法的简洁性,可以稍微缩短一下:

def file_get_contents(filename):
    with open(filename) as f:
        return f.read()

当你离开上下文管理器的代码块时,不论是什么原因,包括出现异常或从函数返回,__exit__部分都会执行——不需要使用中间变量。

撰写回答