一次性读取整个文件

5
我正在尝试编写一个函数,该函数获取路径并返回该文件的内容。无需进行错误处理。我想出了以下代码:
def read_all_1(path):
    f = open(path)
    s = f.read()
    f.close()
    return s

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

我的问题:

  • 哪一个被认为更符合Python的风格?
  • 在第二个函数中,文件是否会通过“with”自动关闭?
  • 是否有更好的方法,也许是一些内置函数?

2
在这种情况下,最符合 Python 风格的做法是不必编写该函数。 - Steven Rumbalski
@StevenRumbalski:我希望这个函数可以在表达式中使用,比如 do_something_with(read_all(path) + something_else) - georg
1
我认为@StevenRumbalski的意思和你想要的一样,例如使用:do_something_with(open('the_file.txt').read()),这将会被很好地"垃圾回收"。 - heltonbiker
2个回答

10
他们都很符合Python的风格。回答你的第二个问题,在第二个函数中,文件确实会自动关闭。这是使用with语句时所采用的协议的一部分。具有讽刺意味的是,在你的第一个示例中,文件并不保证被关闭(稍后会详细说明原因)。
最终,我会选择使用with语句,原因如下 - 根据PEP 343
with EXPR as VAR:
    BLOCK

被翻译成:

mgr = (EXPR)
exit = type(mgr).__exit__  # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
    try:
        VAR = value  # Only if "as VAR" is present
        BLOCK
    except:
        # The exceptional case is handled here
        exc = False
        if not exit(mgr, *sys.exc_info()):
            raise
        # The exception is swallowed if exit() returns true
finally:
    # The normal and non-local-goto cases are handled here
    if exc:
        exit(mgr, None, None, None)

正如你所看到的,这种情况下你会得到很多保护 - 无论在中间代码中发生什么事情,你的文件都有保证被关闭。这也真正有助于可读性;想象一下,如果每次想要打开一个文件都必须放置这个巨大的代码块!


3

我来翻译第二个问题,是的文件将被关闭,请将with语句看作以下方式:

try:
   f = open(filepath)
   <code>
finally:
   f.close()

关于你的第三个问题,没有其他不涉及打开文件的方法。
第三种方法可以是(在不显式关闭文件的情况下):
open(filepath).read()

文件对象将在垃圾回收时关闭,但我认为显式比隐式更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接