2016-09-21 24 views
1

脆弱性タイトル、 脆弱性の深刻度レベル、資産IPアドレス の3つのフィールドに、脆弱性の名前、脆弱性のレベル、および脆弱性が存在するIPアドレスを示すcsvファイルがあります。 の脆弱性が、 重大度の隣に という脆弱性を持つレポートを印刷しようとしています。この脆弱性を持つIPアドレスの最後の列リスト。Pythonを使用したCSVの解析

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 

と私は脆弱性を持っているすべてのIPアドレスが含まれます脆弱性の深刻度レベルと最後のタブと呼ばれる2番目のタブをキーとして脆弱性タイトル]タブを使用して作成したCSVファイルを再作成したい

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]) 

私はとてもうまく説明できません。私は

は、私は次のように、このCSVファイルを作成しようとしています次のCSV

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

を持って言うことができます簡素化してみましょう:ソリューションの

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

の両方が正しいです。ここ 私の最後のスクリプトだけでなく

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') 

は、あなたの車の例を考慮し

+0

あなたが作成しようとしている最終的なcsvの構造例を教えてください。それは本当に役に立ちます –

+0

picmateありがとうございます。質問を詳細に編集しましたか?私はもっ​​と情報を追加する必要がある場合はお知らせください。 –

+0

ようこそ、最後の編集は特に素晴らしいです。ありがとう。 –

答えて

1

構造日付、特に大きなデータセットを操作します。 pandasを使用することをお勧めします。

あなたの問題のために、私は解決策としてpandas groupbyの機能の例を挙げます。あなたはデータを持っていると仮定します。

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

日付を操作するためのパンダは非常にfensyです:

import pandas as pd 

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

その後

groups = grouped.groups 

はあなたが必要とするほとんどである辞書になります。

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

[0,1]は行ラベルを表します。実際には、これらのグループを反復して任意の操作を適用することができます。 CSVファイルにそれらを保存したい場合たとえば、:

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

は、今度はnew_dfあるか見てみましょう:あなたが必要なものです

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

を。最後に、ファイルに保存してください:

new_df.to_csv(filename) 

パンダのデータ操作を学ぶことを強くお勧めします。それはずっと簡単で清潔だったかもしれません。

1

回答に感謝しています。本質的には、カーブランドをキーとする2つの要素タプルを持つ辞書を作成しています。タプルの最初の要素は、色と第、所有者のリストである)。

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

インポートCSV インポートパンダ DF = pd.read_csv( 'のtest.CSV'、名前= [ '脆弱タイトル'、 '脆弱性の重大度'、 '資産のIPアドレス']) #printのDF がグループ化= df.groupby([脆弱性のタイトル]、[脆弱性の重大度]] groups = grouped.groups #print groups new_data = [k +(v ['資産IPアドレス']。tolist()、)for [脆弱性の重大度]、[脆弱性の重大度]、[資産IPアドレス]] new_df = new_df = new_df = new_df = new_df.to_csv( 'final.csv' ) –

関連する問題