![](/img/trans.png)
[英]Python - BeautifulSoup - Scraped content only being written to first text file, not subsequent files
[英]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.