我可以使用 Python 3 'with open(filename, mode) as file:' 并将其保存在对象中以向其发送事件吗?
Can I use Python 3 'with open(filename, mode) as file:' and keep it in an object to send it events?
我正在编写一个管理器 class,它将允许创建不同类型的日志文件(原始、CSV、自定义数据格式),我想保持日志文件打开以写入行当他们进来时。日志文件也可以通过事件(按钮按下、条件)启动和停止。
我想知道我是否可以将 with open('file') as file:
语法与 class 中的实例变量结合起来 - 这样我就不会在文件打开时陷入循环轮询,但是相反,可以按事件写入文件。
我知道如何使用 open 和 close 方法,但每个人都说 "with" 更健壮,并且(更)确定可以将文件写入磁盘。
我想做这样的事情:
class logfile:
def __init__(self,filename,mode):
with open(filename, mode) as self.f:
return
def write(self, input):
self.f.write(input)
并像这样使用它:
lf = logfile("junk.txt","wt") # yeah, lf has to be global to use like this. Keeping demo simple here.
...然后离开方法,做其他事情来刷新屏幕,响应其他事件,稍后当要记录的数据行进来时:
lf.write(dataline)
然后我希望一切都干净利落地关闭,当 lf 消失时文件被刷新到磁盘——要么在程序关闭时隐式地,要么在我将 lf 设置为 None 时显式地消失。
当我尝试这个时,文件(显然)在 return 处从 lf 创建时关闭。我可以检查 lf 并看到
lf.f == <_io.TextIOWrapper name='junk.txt' mode='wt' encoding='UTF-8'>
但是当我尝试使用 lf.write("text")
时,我得到:
ValueError: I/O operation on closed file.
有没有办法使用 "with" 并将其保存在一个实例中?
否则,我是否应该只使用打开、关闭和写入,并确保我在 init 中有 try/except/finally 并在 exit[= 中关闭43=]?
with
语法是 Python 中的 context manager。所以,它所做的是,一旦脱离上下文,它就会调用 file.close()
方法。因此,文件在 return 之后已经关闭。我想你可以这样写你的class:
class logfile:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def write(self, text):
with open(self.filename, self.mode) as f:
f.write(text)
我正在编写一个管理器 class,它将允许创建不同类型的日志文件(原始、CSV、自定义数据格式),我想保持日志文件打开以写入行当他们进来时。日志文件也可以通过事件(按钮按下、条件)启动和停止。
我想知道我是否可以将 with open('file') as file:
语法与 class 中的实例变量结合起来 - 这样我就不会在文件打开时陷入循环轮询,但是相反,可以按事件写入文件。
我知道如何使用 open 和 close 方法,但每个人都说 "with" 更健壮,并且(更)确定可以将文件写入磁盘。
我想做这样的事情:
class logfile:
def __init__(self,filename,mode):
with open(filename, mode) as self.f:
return
def write(self, input):
self.f.write(input)
并像这样使用它:
lf = logfile("junk.txt","wt") # yeah, lf has to be global to use like this. Keeping demo simple here.
...然后离开方法,做其他事情来刷新屏幕,响应其他事件,稍后当要记录的数据行进来时:
lf.write(dataline)
然后我希望一切都干净利落地关闭,当 lf 消失时文件被刷新到磁盘——要么在程序关闭时隐式地,要么在我将 lf 设置为 None 时显式地消失。
当我尝试这个时,文件(显然)在 return 处从 lf 创建时关闭。我可以检查 lf 并看到
lf.f == <_io.TextIOWrapper name='junk.txt' mode='wt' encoding='UTF-8'>
但是当我尝试使用 lf.write("text")
时,我得到:
ValueError: I/O operation on closed file.
有没有办法使用 "with" 并将其保存在一个实例中?
否则,我是否应该只使用打开、关闭和写入,并确保我在 init 中有 try/except/finally 并在 exit[= 中关闭43=]?
with
语法是 Python 中的 context manager。所以,它所做的是,一旦脱离上下文,它就会调用 file.close()
方法。因此,文件在 return 之后已经关闭。我想你可以这样写你的class:
class logfile:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def write(self, text):
with open(self.filename, self.mode) as f:
f.write(text)