我打开一个文件:
mylog = open('test.log', 'w')
有时在我的申请运行期间,mylog
会写一些内容;但有时在应用程序的运行时间内没有写任何东西,这取决于。
在这两种情况下,似乎始终在磁盘上创建文件test.log
。
有没有办法只在第一个内容写入文件时才将文件写入磁盘?(例如mylog.write('blah')
之类的内容)
即。如果永远不会调用mylog.write('...')
,则不会在磁盘上创建(空)文件test.log
。
答案 0 :(得分:5)
创建自己的文件包装类,存储文件对象。它需要以下方法来处理上下文管理器和常规关闭函数
class MyFile():
def __enter__(self):
return self
def __init__(self, path, *args):
''' store the path, but don't actually open the file '''
self.path = path
self.file_object = None
self.args = args
def write(self, s):
''' you open the file here, just before writing '''
if not self.file_object:
self.file_object = open(self.path, *self.args)
self.file_object.write(self, s)
def close(self):
''' close the file '''
if self.file_object:
self.file_object.close()
def __exit__(self, exc_type, exc_value, exc_traceback):
self.close()
您可以使用上下文管理器打开/关闭:
with MyFile('test.log', 'w') as mylog:
mylog.write('...')
或者经典的方式,直接调用函数:
mylog = MyFile('test.log', 'w')
mylog.write('...')
mylog.close()
答案 1 :(得分:1)
你必须创建一个包装器对象,它只会在调用第一个write()
时实际打开文件:
class DelayedFile(object):
fileobj = None
def __init__(self, filename, *args, **kw):
self.filename = filename
self.args = args
self.kw = kw
def write(self, data):
if self.fileobj is None:
self.fileobj = open(self.filename, *self.args, **self.kw)
return self.fileobj.write(data)
def close(self):
if self.fileobj is not None:
return self.close()
def __enter__(self):
return self
def __exit__(self, *args, **kw):
if self.fileobj is not None:
return self.fileobj.__exit__(*args, **kw)
请注意,这有一些缺点;在第一次write()
调用之前,任何开启时的I / O错误都不会被提升。
上述代理对象仅实现standard file
object API的子集;您可以根据需要添加更多方法。