7

我在 ubuntu 中使用 scapy 和 python。我想问是否有人知道如何编写示例代码:

假设我有两个文本文件在脚本运行时正在写入,那么我想检查文件是否超过示例 500 字节,如果超过,那么它将存储文件中的任何内容并创建一个新的文本文件来写入。(输出1.txt、输出2.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 并继续。

4

2 回答 2

16

如果您不想使用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')

运行这个之后...

[mpenning@Bucksnort ~]$ 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
[mpenning@Bucksnort ~]$
于 2012-06-05T11:52:24.547 回答
1

另一种方法(短一点)是使用一个有条件检查文件大小的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 个大小为 10KB 的文件(在当前目录中)...

在此处输入图像描述

于 2018-08-27T12:49:38.073 回答