繁体   English   中英

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

[英]Write a file to disk only when first content is written into it

我用打开文件:

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

有时在我的应用程序运行期间一些内容会写在mylog中; 但有时在应用程序运行期间什么也不写,这要视情况而定。

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

只有将第一个内容写入磁盘后,才可以将文件写入磁盘吗? (例如,类似mylog.write('blah')东西)

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

创建自己的文件包装器类,存储文件对象。 它需要以下方法才能与上下文管理器和正常关闭功能一起使用

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()

您必须创建一个包装对象,该对象仅在调用第一个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错误。

上面的代理对象仅实现标准file对象API的子集; 您可以根据需要添加更多方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM