【问题标题】:Write a file to disk only when first content is written into it仅当第一个内容写入文件时才将文件写入磁盘
【发布时间】:2014-02-27 22:02:09
【问题描述】:

我打开一个文件:

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

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

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

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

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

【问题讨论】:

    标签: python file io sys


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您必须创建一个包装对象,该对象仅在调用第一个 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的一个子集;您可以根据需要添加更多方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 2019-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多