Python 每次写入文件时增加计数器1

2 投票
1 回答
10618 浏览
提问于 2025-04-17 17:21

我想做的是,每次往文件'TCPStreamPayload'写入内容的时候,我希望有一个计数器,每次往文件里添加信息时,这个计数器就增加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。

1 个回答

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。好消息是,这意味着你只需要处理 __init__,而不需要处理 __new__。)

在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

但其实,保持事情的明确性可能是更好的选择。

撰写回答