2017-10-23 17 views
1

これが私のデータだとしましょう。特定の列に基づいてcsvファイルから別のcsvファイルに特定の行をコピーするにはどうすればよいですか?

frame.number frame.len frame.cap_len Packets_Type 
    1    100   100   ICMP_tt 
    2    64   64   UDP 
    3    100   100   ICMP_tt 
    4    87   64   ICMP_nn 
    5    100   100   ICMP_tt 
    6    87   64   ICMP_nn 
    7    100   100   ICMP_tt 
    8    87   64   ICMP_nn 
    9    87   64   ICMP_nn 

私はPackets_Typeは、コードのこれらの行を実行することによりICMP_tt

import csv 
f = open("file.csv", "rb") 
reader = csv.DictReader(f, delimiter=',') 
writer = open("newfile.csv",'wb') 
writer = csv.writer(writer, delimiter=',') 

for row in reader: 
    if row['Packets_Type'] == 'ICMP_tt': 
     writer.writerow(row) 

に等しい行を抽出したい、csvファイルで私のデータを入れて、私はこのエラーを検出しました:

writer.writerow(row) 
_csv.Error: sequence expected 

私がお手伝いできるなら、非常に感謝します。

+0

あなたは2つのアプローチを混在させています。 'DictReader'を使ってデータを読み込み、それをリストとして書き戻そうとします。 – roganjosh

+0

インポートに 'csv.DictReader'を使用しましたが、 'csv。ライターは輸出する。 'csv.DictWriter'を使ってエクスポートしてください。 – Abdou

答えて

0

csv.writerは反復可能(listまたはtuple)ですが、行の値は辞書です。したがって、データを保存する最良の方法は、一貫性を保ち、csv.DictWriterを使用することです。以下の作業をする必要があります:

import csv 


with open("file.csv", "rb") as f: 
    reader = csv.DictReader(f, delimiter=',') 
    with open("newfile.csv", "wb") as f_out: 
     writer = csv.DictWriter(f_out, fieldnames=reader.fieldnames, delimiter=",") 
     writer.writeheader() 
     for row in reader: 
      if row['Packets_Type'] == 'ICMP_tt': 
       writer.writerow(row) 

私はこれが役立ちたいと考えています。

+0

ありがとうございます。 – user6652926

0

あなたはこのpandasの使用に開いている場合は簡単にすることによって行うことができます:ここでの問題は、同時にあなたはcsv.writerでデータをエクスポートしているときに、csv.DictReaderを使用してデータをインポートしているということである

import pandas as pd 

reader = pd.read_csv('file.csv') 
writer = reader[reader['Packets_Type']=='ICMP_tt'] 
writer.to_csv('newfile.csv', index=False) 
+0

それは私にこのエラーを与える:sys:1:DtypeWarning:列(2,5,21,25,26,28,30,31,32,61,63,64,66,67,87,151,158)が混在している。インポート時にdtypeオプションを指定するか、low_memory = Falseを設定します。 – user6652926

関連する問題