我想要做的是每次写入'TCPStreamPayload'文件时,我希望每次将信息附加到文件时都会增加一个计数器。
例如我有:
payloadRecon = open('TCPStreamPayload.txt','a')
segmentCount = 0
--my script here--
然后在底部
if payloadRecon.write:
segmentCount +=1
payloadRecon.write('####TCP PAYLOAD STREAM RECONSTRUCTION. Segment ' + str(segmentCount) + '######' '\n\n\n\n').
基本上,每当我使用我的脚本写入此文件时,我希望段号增加1。
答案 0 :(得分:5)
你真的应该编写一个包装类并使用它而不是普通的file
:
class CountingWrapper(object):
def __init__(self, *args, **kwargs):
self.segment_count = 0
self.f = open(*args, **kwargs)
def write(self, *args, **kwargs):
self.segment_count += 1
return self.f.write(*args, **kwargs)
payloadRecon = CountingWrapper('TCPStreamPayload.txt', 'a')
payloadRecon.write('dsfsd')
assert payloadRecon.count == 1
或者,如果你只想完成三行代码的包装,这样你就不必自己重复了,你可以编写一个包装函数:
segmentCount = 0
def payload_write(f, *args, **kwargs):
global segmentCount
segmentCount += 1
return f.write(*args, **kwargs)
现在,你只需要这个单行计数和写作:
payload_write(payloadRecon, '####TCP PAYLOAD STREAM RECONSTRUCTION. Segment ' + str(segmentCount) + '######' '\n\n\n\n')
assert segmentCount == 1
如果需要包装多个方法,则类更灵活。但是你显然需要委托你关心的任何其他方法。当然,您可以通过__getattr__
动态执行委派。或者你可以使用继承。 (但请记住,在3.x中,类不是file
,而是io
包中的一个类,并且您不应该创建file
或无论如何,io.whatever
由构造函数,但是open
,所以你仍然需要编写一个包装器工厂函数来替换open
。好消息是,这意味着你不需要处理__new__
,只需__init__
。)
在3.x中,您甚至可以对实例进行monkeypatch(但这在2.x中不起作用,其中file.write
是只读的):
payloadRecon = open('TCPStreamPayload.txt', 'a')
segmentCount = 0
write_original = payloadRecon.write
def write_and_count(self, *args, **kwargs):
global segmentCount
segmentCount += 1
write_original(self, *args, **kwargs)
payloadRecon.write = write_and_count
但实际上,保持事实清楚可能就是去这里的方式。