python - 我可以使用 Python 3 'with open(filename, mode) as file:' 并将其保存在对象中以发送事件吗?
问题描述
我正在编写一个允许创建不同类型的日志文件(原始、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”并将其保存在一个实例中?
如果做不到这一点,我是否应该只使用 open、close 和 write,并确保我在init中有 try/except/finally并在exit中关闭?
解决方案
with
语法是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)
推荐阅读
- angular - 在生成的 HTML 中监听点击事件
- docker - 无法从 GCP Container Registry 拉取镜像
- reactjs - 结果页面中的搜索表单 - ReactJs
- ms-word - 表内的内容不生成 TOC
- javascript - 如何处理来自python的多个返回作为JavaScript中的多个参数?
- mips - 如何在 mips 中不使用 add.s/add.d 来添加两个实数?
- php - 如何从表单中回显语句?
- python - os.system 和 subprocess.Popen 不适用于使用 PyInstaller 编译的 macOS .app 文件
- ruby-on-rails - 使用 ActionText 创建电子邮件:将 #LASTNAME 等占位符替换为数据库中的实际值
- java - System.in 的 Java 扫描程序抛出 java.util.NoSuchElementException:找不到行