2013-02-27 1 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

+0

Не могли бы вы просто вызвать 'payloadRecon.write', а затем после' segmentCount + = 1'? Вы можете поставить 'try' вокруг записи, если вы обеспокоены тем, что это не сработает. Какую ошибку вы видите? – GordonsBeard

ответ

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 

Но на самом деле , явное сохранение вещей, вероятно, путь сюда.

+0

Спасибо, кучка: D Оцените это! – InvertReality

+1

AttributeError: атрибут 'file' 'write' доступен только для чтения на py2, в py3 это нормально. – XORcist

+1

@ EricRoper: Весь смысл '* args' заключается в том, что он берет кортеж' args' и разбивает его на кучу отдельных аргументов. Вот как вы делаете родовое совершенное переадресацию аргументов в Python. Например, 'def wrap_open (* args, * kwargs): return open (* args, ** kwargs)', затем 'f = wrap_open (" bar.txt "," a ")', а затем проверьте 'f'. – abarnert

Смежные вопросы