2017-08-09 2 views
0

je travaille sur un petit projet qui parse csvfichier csv Python contenant Parsing IP et les ports

fichier csv si je travaille sur IP doit contenir des ports ouverts séparés par des virgules

192.168.10.45 , 80,443,20,21,8080

192.168.10.49,22,80,21

donc, je suis en train de lire ce fichier puis écrire un fichier de sortie pour chaque port qui contiennent des adresses IP pour IP avec cette port ouvert. par exemple. 22.txt doit contenir

192.168.10.45 192.168.10.49

Toute idée comment je pourrais le faire ou une bonne référence. Je suis toujours noob en python3

import csv 
import sys 

with open(sys.argv[1], 'rt') as f: 
reader = csv.reader(f) 
for row in reader: 
    print((row)[1]) 

Merci d'avance!

+0

Le fichier contient-il uniquement des listes d'adresses IP et de ports? – JohanL

Répondre

1

Je n'ai pas utilisé la bibliothèque csv parce que votre fichier csv n'a pas d'en-tête et possède un nombre variable de ports ouverts. C'est plus facile et moins de code/deps. par ici.

VERSION 1 sans forfait csv

import os, sys 
from collections import defaultdict 

def main(csv): 

    # use defaultdict so there is no need to initialize 
    # use set to remove duplicate entries 
    port_ip_map = defaultdict(set) 

    # open with, handles errors open closing file handles etc. 
    with open(csv, 'r') as f: 
     # read lines 
     lines = f.readlines() 
     for line in lines: 
      # ip must always be the first entry 
      # port lists can have a variable length 
      ip, *ports = line.split(',') 
      for port in ports: 
       # save ips by port 
       port = int(port.strip()) 
       port_ip_map[port].add(ip) 



    for port, ips in port_ip_map.items(): 
     line = ' '.join(ips) 
     with open('{}.txt'.format(port), 'w') as f: 
      f.write(line) 




if __name__ == '__main__': 
    # main(sys.argv[1]) # pass csv file by cli 
    main('./test1.csv') 

VERSION 2 avec le paquet csv

import os, sys, csv 
from collections import defaultdict 

def main(csv_path): 

    # use defaultdict so there is no need to initialize 
    # use set to remove duplicate entries 
    port_ip_map = defaultdict(set) 

    # open with, handles errors open closing file handles etc. 
    with open(csv_path, 'r') as f: 
     # read lines 
     reader = csv.reader(f) 
     for row in reader: 

      # ip must always be the first entry 
      # port lists can have a variable length 
      ip, *ports = row 
      for port in ports: 
       # save ips by port 
       port = int(port.strip()) 
       port_ip_map[port].add(ip) 



    for port, ips in port_ip_map.items(): 
     line = ' '.join(ips) 
     with open('{}.txt'.format(port), 'w') as f: 
      f.write(line) 




if __name__ == '__main__': 
    # main(sys.argv[1]) # pass csv file by cli 
    main('./test1.csv') 

entrée d'échantillon: test1.csv

192.168.10.49,22,80,21 
192.168.10.45,80,443,20,21,8080 
sortie

échantillon:

defaultdict(<class 'set'>, {22: {'192.168.10.49'}, 80: {'192.168.10.45', '192.168.10.49'}, 21: {'192.168.10.45', '192.168.10.49'}, 443: {'192.168.10.45'}, 20: {'192.168.10.45'}, 8080: {'192.168.10.45'}}) 
+0

Pourquoi ne pas utiliser csv ici?Cela fonctionne parfaitement bien. – JohanL

+0

vous pouvez le faire, mais il n'y a pas besoin d'oublier d'ajouter l'écriture des fichiers port.txt. ajoutez-le dans un instant – mumbala

+0

Oui il y a. Maintenant, vous lancez votre propre split csv à la place. – JohanL

0

En supposant que le port que vous recherchez est le deuxième argument du script que vous pourriez faire:

import csv 
import sys 

infile = sys.argv[1] 
port = sys.argv[2] 

with open(infile, 'rt') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     if port in row[1:]: 
      print('{}:{}'.format(row[0], port)) 

Ici, pour chaque ligne de votre fichier, la ligne if port in row[1:] recherchera le port chacun des éléments de la liste. Je suppose que c'est ce que tu veux?

Notez que j'ai légèrement modifié la ligne print pour imprimer également le port.

0

Vous devriez envisager d'utiliser un dictionnaire Python, ou dict. Il y a aussi un OrderedDict de la bibliothèque de collections.

Par exemple:

import collections 

    ips_ordered_by_port = collections.OrderedDict() 
    with open(sys.argv[1], 'rt') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     row_parts = row.split(',') 
     ip = row_parts[0] 
     for row_part_idx in range(1, len(row_parts)): 
      port = row_parts[row_part_idx] 
      ip_ordered_by_port = ips_ordered_by_port.get(port) 
      if ip_ordered_by_port is None: 
       ips_ordered_by_port[port] = ip 
      else: 
       ip_ordered_by_port.update(ip) 

Maintenant, vous aurez un dict commandé par le port (la clé) et pour chaque touche les éléments (valeurs) sera l'adresse IP. Pour parcourir chaque clé, créez un fichier pour cette clé et écrivez toute l'adresse IP que je vous ai laissée.

Bien sûr, le code ci-dessus pourrait être refactorisé en plusieurs fonctions pour une meilleure lisibilité et testabilité.

+0

Merci beaucoup @ozOil pour votre aide. Je vais essayer de mieux en python et faire le travail moi-même. –