仅在将第一个内容写入磁盘时将文件写入磁盘

时间:2014-02-27 22:02:09

标签: python file io sys

我打开一个文件:

mylog = open('test.log', 'w')

有时在我的申请运行期间,mylog会写一些内容;但有时在应用程序的运行时间内没有写任何东西,这取决于。

在这两种情况下,似乎始终在磁盘上创建文件test.log

有没有办法只在第一个内容写入文件时才将文件写入磁盘?(例如mylog.write('blah')之类的内容)

即。如果永远不会调用mylog.write('...'),则不会在磁盘上创建(空)文件test.log

2 个答案:

答案 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的子集;您可以根据需要添加更多方法。