Python 在函数中使用open(filename,';r';)我是否应该再次关闭它?
我通常使用“with open”,这样我就不必担心再次关闭文件,但我想创建一个打开文件的函数: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
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)不是没有必要的吗,因为我从未使用过它?