2008-11-16 6 views
3

J'écris un programme simple qui va analyser un fichier journal d'une sauvegarde de paquets de wireshark dans une forme plus lisible. Je fais ça avec python.Aide Python - Analyse des paquets de paquets

Actuellement, je suis bloqué sur cette partie:

for i in range(len(linelist)): 
if '### SERVER' in linelist[i]: 
    #do server parsing stuff 

    packet = linelist[i:find("\n\n", i, len(linelist))] 

est une liste Liste des lignes créée en utilisant la méthode readlines(), de sorte que chaque ligne du fichier est un élément dans la liste. Je suis itérer à travers lui pour toutes les occurrences de "### SERVER", puis en saisissant toutes les lignes après elle jusqu'à la ligne vide suivante (ce qui signifie la fin du paquet). Je dois faire quelque chose de mal, parce que non seulement find() ne fonctionne pas, mais j'ai le sentiment qu'il y a une meilleure façon de tout saisir entre ### SERVER et la prochaine occurrence d'une ligne vide.

Des idées?

Répondre

1

En regardant le file.readlines() doc:

file.readlines ([sizeHint])

Lire jusqu'à EOF en utilisant readline() et retourner une liste contenant les lignes ainsi lues. Si l'argument sizehint facultatif est présent, au lieu de lire EOF, des lignes entières totalisant approximativement sizehint bytes (éventuellement après avoir arrondi à une taille de buffer interne) sont lues. Les objets implémentant une interface de type fichier peuvent choisir d'ignorer sizehint s'il ne peut pas être implémenté ou ne peut pas être implémenté efficacement.

et file.readline() doc:

file.readline ([size])

Lire une ligne complète du fichier. Un caractère de fin de ligne final est conservé dans la chaîne (mais peut être absent lorsqu'un fichier se termine par une ligne incomplète). [6] Si l'argument size est présent et non négatif, il s'agit d'un nombre d'octets maximum (y compris le saut de ligne final) et une ligne incomplète peut être retournée. Une chaîne vide est renvoyée uniquement lorsque EOF est rencontré immédiatement.

A trailing newline character is kept in the string - signifie que chaque ligne linelist contiendra au plus un retour à la ligne. C'est la raison pour laquelle vous ne trouvez pas une sous-chaîne "\n\n" dans l'une des lignes - chercher une ligne vide toute (ou un vide à EOF):

if myline in ("\n", ""): 
    handle_empty_line() 

Note: J'ai essayé d'expliquer le comportement find, mais La solution pythonic est très différente de votre extrait de code.

0

idée générale est:

inpacket = False 
packets = [] 
for line in open("logfile"): 
    if inpacket: 
    content += line 
    if line in ("\n", ""): # empty line 
     inpacket = False 
     packets.append(content) 
    elif '### SERVER' in line: 
    inpacket = True 
    content = line 
# put here packets.append on eof if needed 
0

Cela fonctionne bien avec un iterator explicite, aussi. De cette façon, les boucles imbriquées peuvent mettre à jour l'état de l'itérateur en consommant des lignes.

fileIter= iter(theFile) 
for x in fileIter: 
    if "### SERVER" in x: 
     block = [x] 
     for y in fileIter: 
      if len(y.strip()) == 0: # empty line 
       break 
      block.append(y) 
     print block # Or whatever 
    # elif some other pattern: 

Cela a bien agréable de trouver des blocs qui sont à la fin de la queue du fichier, et ne disposent pas d'une ligne vide y mettre fin.

De plus, il est assez facile de généraliser, puisqu'il n'y a pas de variable de changement d'état explicite, vous allez juste dans une autre boucle pour absorber des lignes dans d'autres types de blocs.

0

meilleur moyen - générateurs d'utilisation de présentation de lecture Generator Tricks for Systems Programmers Ce meilleur que j'ai vu sur les journaux d'analyse syntaxique;)

+0

Ce fut ma première pensée, aussi. Une version légèrement plus à jour de la même conversation est à http://www.dabeaz.com/generators-uk/. J'ai en fait eu * rêves * sur les pipelines de générateurs. (comment c'est bizarre?). –

Questions connexes