2016-09-21 5 views
1

J'ai le fichier csv suivant qui a trois champs Titre de vulnérabilité, Vulnérabilité Niveau de gravité, Asset IP Address qui montre le nom des vulnérabilités, le niveau de vulnérabilité et l'adresse IP qui présente cette vulnérabilité. Je suis en train d'imprimer un rapport qui répertorierait vulnérabilité dans une colonne gravité à côté de et la dernière colonne de l'adresse IP ayant cette vulnérabilité.Analyser CSV en utilisant Python

Vulnerability Title Vulnerability Severity Level Asset IP Address 
TLS/SSL Server Supports RC4 Cipher Algorithms (CVE-2013-2566) 4 10.103.64.10 
TLS/SSL Server Supports RC4 Cipher Algorithms (CVE-2013-2566) 4 10.103.64.10 
TLS/SSL Server Supports RC4 Cipher Algorithms (CVE-2013-2566) 4 10.103.65.10 
TLS/SSL Server Supports RC4 Cipher Algorithms (CVE-2013-2566) 4 10.103.65.164 
TLS/SSL Server Supports RC4 Cipher Algorithms (CVE-2013-2566) 4 10.103.64.10 
TLS/SSL Server Supports RC4 Cipher Algorithms (CVE-2013-2566) 4 10.10.30.81 
TLS/SSL Server Supports RC4 Cipher Algorithms (CVE-2013-2566) 4 10.10.30.81 
TLS/SSL Server Supports RC4 Cipher Algorithms (CVE-2013-2566) 4 10.10.50.82 
TLS/SSL Server Supports Weak Cipher Algorithms 6 10.103.65.164 
Weak Cryptographic Key 3 10.103.64.10 
Unencrypted Telnet Service Available 4 10.10.30.81 
Unencrypted Telnet Service Available 4 10.10.50.82 
TLS/SSL Server Supports Anonymous Cipher Suites with no Key Authentication 6 10.103.65.164 
TLS/SSL Server Supports The Use of Static Key Ciphers 3 10.103.64.10 
TLS/SSL Server Supports The Use of Static Key Ciphers 3 10.103.65.10 
TLS/SSL Server Supports The Use of Static Key Ciphers 3 10.103.65.100 
TLS/SSL Server Supports The Use of Static Key Ciphers 3 10.103.65.164 
TLS/SSL Server Supports The Use of Static Key Ciphers 3 10.103.65.164 
TLS/SSL Server Supports The Use of Static Key Ciphers 3 10.103.64.10 
TLS/SSL Server Supports The Use of Static Key Ciphers 3 10.10.30.81 

et je voudrais recréer un fichier csv qui utilise l'onglet Titre de la vulnérabilité comme la clé et crée un second onglet appelé vulnérabilité Niveau de gravité et dernier onglet contiendra toutes les adresses IP qui a les vulnérabilités

import csv 
from pprint import pprint 
from collections import defaultdict 
import glob 
x= glob.glob("/root/*.csv") 

d = defaultdict() 
n = defaultdict() 
for items in x: 
     with open(items, 'rb') as f: 
       reader = csv.DictReader(f, delimiter=',') 
       for row in reader: 
         a = row["Vulnerability Title"] 
         b = row["Vulnerability Severity Level"], row["Asset IP Address"] 
         c = row["Asset IP Address"] 
     #    d = row["Vulnerability Proof"] 
         d.setdefault(a, []).append(b) 
     f.close() 
pprint(d) 
with open('results/ipaddress.csv', 'wb') as csv_file: 
     writer = csv.writer(csv_file) 
     for key, value in d.items(): 
       for x,y in value: 
         n.setdefault(y, []).append(x) 
#      print x 
         writer.writerow([key,n]) 

with open('results/ipaddress2.csv', 'wb') as csv2_file: 
     writer = csv.writer(csv2_file) 
     for key, value in d.items(): 
      n.setdefault(value, []).append(key) 
      writer.writerow([key,n]) 

Depuis que je ne peux pas expliquer très bien. Je vais essayer de simplifier

permet de dire que je l'csv suivante

Car model owner 
Honda Blue James 
Toyota Blue Tom 
Chevy Green James 
Chevy Green Tom 

Je suis en train de créer cette csv comme suit:

Car model owner 
Honda Blue James 
Toyota Blue Tom 
Chevy Green James,Tom 

les deux solutions sont correctes. voici mon script final ainsi

import csv 
import pandas as pd 

df = pd.read_csv('test.csv', names=['Vulnerability Title', 'Vulnerability Severity Level','Asset IP Address']) 
#print df 
grouped = df.groupby(['Vulnerability Title','Vulnerability Severity Level']) 

groups = grouped.groups 
#print groups 
new_data = [k + (v['Asset IP Address'].tolist(),) for k, v in grouped] 
new_df = pd.DataFrame(new_data, columns=['Vulnerability Title' ,'Vulnerability Severity Level', 'Asset IP Address']) 

print new_df 
new_df.to_csv('final.csv') 

merci

+0

Pourriez-vous donner un exemple, la structure du csv final que vous essayez de créer? Ce serait vraiment utile –

+0

merci picmate. J'ai édité les questions avec plus de détails? laissez-moi savoir si je devrais ajouter plus d'informations. –

+0

Vous êtes les bienvenus, la dernière édition en particulier est super. Merci. –

Répondre

1

Lorsque manipuler la date structurée, en particulier un grand ensemble de données. Je voudrais vous suggérer d'utiliser pandas.

Pour votre problème, je vais vous donner un exemple de fonctionnalité de groupe par pandas comme solution. Supposons que vous avez les données:

data = [['vt1', 3, '10.0.0.1'], ['vt1', 3, '10.0.0.2'], 
     ['vt2', 4, '10.0.10.10']] 

Les pandas géants pour faire fonctionner ce jour est très fensy:

import pandas as pd 

df = pd.DataFrame(data=data, columns=['title', 'level', 'ip']) 
grouped = df.groupby(['title', 'level']) 

Puis

groups = grouped.groups 

sera un dict qui est presque vous avez besoin.

print(groups) 
{('vt1', 3): [0, 1], ('vt2', 4): [2]} 

[0,1] représente le libellé de ligne. En fait, vous pouvez itérer sur ces groupes pour appliquer n'importe quelle opération. Par exemple, si vous voulez les enregistrer dans le fichier csv:

new_data = [k + (v['ip'].tolist(),) for k, v in grouped] 
new_df = pd.DataFrame(new_data, columns=['title', 'level', 'ips']) 

Voyons voir ce qui est new_df maintenant:

title level     ips 
0 vt1  3 [10.0.0.1, 10.0.0.2] 
1 vt2  4   [10.0.10.10] 

C'est ce que vous avez besoin.Et enfin, enregistrer dans le fichier:

new_df.to_csv(filename) 

Je suggère fortement que vous devriez apprendre la manipulation de données pandas. Vous pouvez trouver que c'était beaucoup plus facile et plus propre.

1

réponse compte tenu de votre exemple de voiture. Essentiellement, je crée un dictionnaire qui a la marque de voiture comme clé, et un tuple de deux éléments. Le premier élément du tuple est la couleur et la seconde, une liste des propriétaires).

import csv 

car_dict = {} 
with open('<file_to_read>', 'rb') as fi: 
    reader = csv.reader(fi) 
    for f in reader: 
     if f[0] in car_dict: 
      car_dict[f[0]][1].append(f[2]) 
     else: 
      car_dict[f[0]] = (f[1], [f[2]]) 

with open('<file_to_write>', 'wb') as ou: 
    for k in car_dict: 
     out_string ='{}\t{}\t{}\n'.format(k, car_dict[k][0], ','.join(car_dict[k][1])) 
     ou.write(out_string) 
+0

importation csv pandas géants à l'importation comme pd df = pd.read_csv ('test.csv', nom = [ 'Titre de la vulnérabilité', 'vulnérabilité Niveau de gravité', 'Asset Adresse IP']) #print df = groupés df.groupby (['Titre de vulnérabilité', 'Niveau de gravité de vulnérabilité']) groups = grouped.groups groupes d'impressions new_data = [k + (v ['Asset IP Address']. tolist(),) pour k, v dans groupé] new_df = pd.DataFrame (nouveaux_données, colonnes = ['Titre de vulnérabilité', 'Niveau de gravité de vulnérabilité', 'Adresse IP de l'actif']) print new_df new_df.to_csv ('final.csv') –