如何在Python中获取小ASCII文件的内容?
假设我们想要实现一个和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__
部分都会执行——不需要使用中间变量。