python - 我可以使用 Python 3 'with open(filename, mode) as file:' 并将其保存在对象中以向其发送事件吗?

标签 python file oop with-statement event-based-programming

我正在编写一个管理器类,它将允许创建不同类型的日志文件(原始、CSV、自定义数据格式),并且我想保持日志文件打开以在它们进入时写入行。日志文件也可以通过事件(按钮按下、条件)启动和停止。

我想知道我是否可以将 with open('file') as file: 语法与类中的实例变量结合起来 - 这样我就不会陷入循环轮询文件已打开,但可以通过事件写入文件。

我知道如何使用 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 时显式地消失。

当我尝试这样做时,文件(显然)在创建 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 中关闭?

最佳答案

with 语法是 context manager在 Python 中。因此,它所做的是,一旦脱离上下文,它就会调用 file.close() 方法。因此,文件在返回后已经关闭。我想你可以这样写你的课:

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)

关于python - 我可以使用 Python 3 'with open(filename, mode) as file:' 并将其保存在对象中以向其发送事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58812426/

相关文章:

类中的 JavaScript/jQuery 变量作用域 (this)

python - python中的 'is'关键字是一个函数吗?

c - fprintf 返回成功但无法写入现有文件

file - 如何打开最有可能是二进制的 LUA 文件?

php如何获取子类的__DIR__

php - 学习 PHP 5 高级 OOP 特性的好资源?

python - 使用 TFlearn 塑造线性回归数据

python - Python中通过SFTP(Paramiko)上传文件给出IOError : Failure

python - 你如何检查一个python方法是否被绑定(bind)?

android - 将文件从原始目录复制到 SD 卡