Python 在函数中使用open(filename,';r';)我是否应该再次关闭它?

Python 在函数中使用open(filename,';r';)我是否应该再次关闭它?,python,python-3.x,function,file,Python,Python 3.x,Function,File,我通常使用“with open”,这样我就不必担心再次关闭文件,但我想创建一个打开文件的函数: def SafeOpen(filename,mode): try: infile=open(filename,mode) except IOError as error: print('Can not open

我通常使用“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”来代替吗

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

return_val.close()

如果不返回文件,变量将自动释放。。。尽管在任何情况下都不使用
with

是不好的做法,但您可以在
with
语句中调用您的函数:

with SafeOpen("test","r") as f:
    c = f.readline()  # OK
c = f.readline()  # error: operation on closed file
一旦退出块,文件将被关闭。
\uuuu退出
函数适用于
f
文件对象,无需更改函数(当然,不要在函数中使用打开的


也就是说,让
IOException
传播并退出程序就足够了。使用
sys.exit
可以中断调用您模块的应用程序(必须截获
SystemExit
异常)

您的函数相当于
open
函数,因此您必须关闭该文件。您应该让异常传播,因为在python中open已经是安全的(因为未修补的异常也会退出进程),您可以将
一起使用,因为您的函数返回了file对象。上下文管理器是为文件对象创建的,python不关心它来自何处。with
接受它显示的任何对象并调用它的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法(如果没有这样的方法
open
是一个类似于
SafeOpen
的函数,两者都返回一个文件对象(
io.TextIOWrapper
,用于文本文件),并使用
\uuuuu enter\uuu
方法。我不确定我是否完全理解。我刚刚编辑了我的帖子,当然我更愿意使用感谢!在with语句中调用我的函数是有意义的,但我必须更改我的SafeOpen函数,对吗?我只是感到困惑,因为在函数中我返回'infle',但在'with'语句中我也以infle的形式打开它,所以这不是做了两次同样的事情吗?不。你的函数会打开(其他语句都不会),并映射到
f
f
对象与
with
块“关联”
f.。\uuuu exit\uuuu
在退出块时被调用,它调用
f.close
,但是我的返回(infle)不是没有必要的吗,因为我从未使用过它?