【问题标题】:Using open(filename,'r') in function - should I close it again?在函数中使用 open(filename,'r') - 我应该再次关闭它吗?
【发布时间】:2018-09-24 21:19:54
【问题描述】:

我通常使用'with open',我不必担心再次关闭文件,但我想创建一个打开文件的函数:

def SafeOpen(filename,mode):

    try:
        infile=open(filename,mode)               

    except IOError as error:                                                        
        print('Can not open file due to error:',str(error)) 
        sys.exit(1)    

    return(infile)

我应该再次关闭文件吗?

编辑:

例如 - 我应该这样做:

infile=SafeOpen(filename,'r')
for line in infile:
    print(line)
infile.close()

我可以改用“with open”吗?

【问题讨论】:

  • 你的函数相当于open函数,所以是的,你必须关闭文件。而且你应该让异常传播,因为在 python 中打开已经是安全的(因为未捕获的异常也会退出进程)
  • 您可以使用with,因为您的函数返回了文件对象。上下文管理器是为文件对象创建的,python 不在乎它来自哪里。
  • with 接受它所呈现的任何对象并调用其__enter__ 方法(如果没有这样的方法,则会引发错误)。 open 是一个类似于 SafeOpen 的函数,两者都使用 __enter__ 方法返回一个文件对象(io.TextIOWrapper 用于文本文件)。

标签: python python-3.x function file


【解决方案1】:

您可以在with 语句中调用您的函数:

with SafeOpen("test","r") as f:
    c = f.readline()  # OK
c = f.readline()  # error: operation on closed file

一旦您退出该块,该文件将被关闭。 __exit__ 函数适用于f 文件对象,不需要改变你的函数(当然不要在你的函数中使用with open!)。

也就是说,让IOException 传播并退出您的程序通常就足够了。使用sys.exit 可能会破坏调用您模块的应用程序(它必须拦截SystemExit 异常)

【讨论】:

  • 谢谢!在 with 语句中调用我的函数是有意义的
  • 但是我必须改变我的 SafeOpen 功能,对吧?
  • 我很困惑,因为在函数中我返回'infile',但在'with'语句中我也将它作为infile打开,所以不是两次做同样的事情吗?
  • 没有。您的函数执行 open(并且没有其他语句执行),并映射到 ff 对象与with 块“关联”。退出块时调用f.__exit__,即调用f.close
  • 但是我的 return(infile) 不是没有必要,因为我从不使用它吗?
【解决方案2】:

如果您返回文件,您最终需要使用

关闭它
return_val.close()

如果您不返回文件,该变量将自动释放...尽管在任何情况下不使用with 都是不好的做法

【讨论】:

  • 我不确定我是否完全理解。我刚刚编辑了我的帖子,我当然更喜欢与一起使用
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 2018-12-14
  • 2013-12-04
  • 2014-07-13
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多