Вопрос по file-io, python – python: выход в другой текстовый файл, если размер файла превышает определенный

3

Я использовал scapy с python в Ubuntu. Я хотел бы спросить, если кто-нибудь знает, как кодировать пример:

Допустим, у меня есть два текстовых файла, которые пишутся во время работы скрипта, и я хотел бы проверить, что размер файла превышает пример 500 байт, если да, то он сохранит все в файле и создаст новый текстовый файл для записи. (output1.txt, output2.txt и т. д.)

Был бы признателен, если любая экспертиза поможет. Спасибо


часть моего кода:

file = open("output.txt","w")

def example(p):
    if p.haslayer(Dot11Beacon):
        if p.addr2 not in uniqueAP:
            file.writelines(p.addr2 + "\n")

поэтому, пока скрипт работает в терминале, он запишет его в файл с именем output.txt, но я хотел бы улучшить скрипт для проверки размера файла текстового файла, а при превышении он прекратит запись в текущий и создаст новый output2.txt например и продолжить.

Я бы следил за байтами, записанными в каждый файл в вашей программе, например, в специальном классе записи файлов. Во всяком случае, что вы пробовали до сих пор? Joel Cornett
Ты имеешь ввидуthe script пишет в файлы или что-то еще, а вы просто проверяете размер? phg
Я бы посмотрел вRotatingFileHandlers. miku

Ваш Ответ

2   ответа
13

Простой пример, если вы не хотите использоватьRotatingFileHandler.

Вы должны использоватьos.stat('filename').st_size проверить размеры файлов.

import os
import sys

class RotatingFile(object):
    def __init__(self, directory='', filename='foo', max_files=sys.maxint,
        max_file_size=50000):
        self.ii = 1
        self.directory, self.filename      = directory, filename
        self.max_file_size, self.max_files = max_file_size, max_files
        self.finished, self.fh             = False, None
        self.open()

    def rotate(self):
        """Rotate the file, if necessary"""
        if (os.stat(self.filename_template).st_size>self.max_file_size):
            self.close()
            self.ii += 1
            if (self.ii<=self.max_files):
                self.open()
            else:
                self.close()
                self.finished = True

    def open(self):
        self.fh = open(self.filename_template, 'w')

    def write(self, text=""):
        self.fh.write(text)
        self.fh.flush()
        self.rotate()

    def close(self):
        self.fh.close()

    @property
    def filename_template(self):
        return self.directory + self.filename + "_%0.2d" % self.ii

if __name__=='__main__':
    myfile = RotatingFile(max_files=9)
    while not myfile.finished:
        myfile.write('this is a test')

После запуска этого ...

[[email protected] ~]$ ls -la | grep foo_
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_01
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_02
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_03
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_04
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_05
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_06
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_07
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_08
-rw-r--r--  1 mpenning mpenning    50008 Jun  5 06:51 foo_09
[[email protected] ~]$
Error: User Rate Limit Exceededdirectory='/home/user/Output/'
Error: User Rate Limit Exceeded leong
Error: User Rate Limit Exceededfilename_template()Error: User Rate Limit Exceededreturn self.directory + self.filename + str(datetime.date.today()) + "_%0.2d" % self.iiError: User Rate Limit Exceededimport datetimeError: User Rate Limit Exceeded
Error: User Rate Limit Exceededcurrent-dateError: User Rate Limit Exceeded leong
Error: User Rate Limit Exceededstr(datetime.datetime.now()).replace(' ', '_')Error: User Rate Limit Exceededos keeps file creation time as metadata (at least to second precision, sometimes to millisecond precision)Error: User Rate Limit Exceeded
0

Другой способ (немного короче) будет использоватьwith пункт, имеющийif проверка условий на размер файла: -

def RotateFile(count, file_size, file_name):
    indX = 0
    while indX < count:  
        with open(file_name,"a") as fd:  
            ##
            fd.write("DUMMY TEXT\n")      
            ##  
            if int(os.path.getsize(file_name)) > file_size:
                indX += 1
                file_name = "new_file"+str(indX)+".txt"

with оператор создает менеджер контекста, так что к тому времени, когда вы достигнете концаif условие, объект файла вfd будет автоматически закрыт.

Далее нужно указать нужные параметры и перейти к методу:

if __name__ == "__main__":
    count = 10                           ## 10 number of files
    file_size = 10000                    ## 10KB in size
    file_name = "new_file.txt"           ## with this name
    RotateFile(count, file_size, file_name)

После выполнения он выдаст 10 файлов размером 10 КБ каждый (в текущем каталоге) ...

enter image description here

Похожие вопросы