2013-02-27 152 views
2

我想要做的是每当文件“TCPStreamPayload”写入时,我都希望计数器在每次将信息追加到文件时增加。Python每次将某个内容写入文件时,将计数器增加1

比如我有:

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

真的是你的问题,我怎么能记住我的脚本的调用之间'segmentCount'的最后一个值?或者我误解了? – Skurmedel 2013-02-27 20:26:32

+0

难道你不能只调用'payloadRecon.write',然后'segmentCount + = 1'?如果你担心它不能正常工作,你可以在写入过程中尝试一下。你看到什么错误? – GordonsBeard 2013-02-27 20:28:40

回答

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包中的一个班级,无论如何您不应通过构造函数创建fileio.whatever,而是通过open,会仍然需要编写一个包装厂函数来取代open。好消息是,这意味着你不需要处理__new__,只是__init__

在3.x中,你甚至可以猴补丁的实例(但这在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 

但是真的,保持事物明确可能是这里的一种方式。

+0

非常感谢:D欣赏它! – InvertReality 2013-02-27 20:39:57

+1

AttributeError:py2上的'file'对象属性'write'是只读的 ,但在py3中它是好的。 – XORcist 2013-02-27 20:41:17

+1

@EricRoper:'* args'的重点在于它需要'args'元组并将其分割成一堆单独的参数。这就是你如何在Python中完成泛型完美的参数转发。例如,'def wrap_open(* args,* kwargs):return open(* args,** kwargs)',然后'f = wrap_open(“bar.txt”,“a”)',然后检查f。 – abarnert 2013-02-27 20:41:56

相关问题