2016-11-04 4 views
0

私はPythonの開始です。私はCSVファイルのデータを消去しようとしています。Python CSV文字列スライシングの問題

しかし私は、いくつかのフィールドは、このように複数の電子メールを持っている、電子メールのリストを持っている:

companyNameA | [email protected];[email protected];[email protected] | date joined 

私は各電子メールのための行を複製する方法を理解していません。その他のデータは、同じ滞在する必要がありますが、このようなので、メールは異なっている必要があります:私はこれを試してみましたが、それは動作しません

companyNameA | [email protected] | date joined 
companyNameA | [email protected] | date joined 
companyNameA | [email protected] | date joined 

f = open('data_file.csv') 
csv_f = csv.reader(f) 

for row in csv_f: 
    email = row[1] 
    single_email = email.rsplit(';', 1)[0] 
+0

これを印刷するだけですか?または、それを再構成してファイルに書き戻そうとしていますか? – idjaw

+0

これは良いスタートですが、実際にあなたのcsvファイルを変更しようとしましたか? – Julien

答えて

0

あなたが唯一のメールを取得しているsingle_email = email.rsplit(';', 1)[0]で住所。あなたは第二のカラムを分割し、ループ内でそれらを介して行く、このようなものでした:

f = open('data_file.csv') 
csv_f = csv.reader(f) 

for row in csv_f: 
    email = row[1] 
    for mail_addr in email.split(';'): 
     do_something() 
1

あなたはラインで1つのCSVラインから読み込まれ、より多くのNOの場合複数行で別のものに書き込む必要があります。電子メール列の電子メールの

fin = open('data_file.csv') 
fout = open('out_data_file.csv', 'w') 

csv_fin = csv.reader(fin) 
csv_fout = csv.writer(fout) 

for row in csv_fin: 
    emails = row[1].split(';') 
    if len(emails) > 1: 
     for e in emails: 
      csv_fout.writerow((row[0], e, row[2])) 
    else: 
     csv_fout.writerow(row) 

ご希望のものです。

1

メールアドレスごとに行を作成するには、まず入力CSVファイルから各行を読み込む必要があります。これは、デリミタが|文字に設定されたCSVリーダーオブジェクトを使用して行われます。 writerows()関数を使用して、複数の行を1つの行に書き込むことができます。;文字の2番目の列エントリを分割して見つかった各電子メールアドレスに対して1つずつ書き込みます。

この例では、ジェネレータを使用して行われます。各電子メールアドレスに対して、入力行の最初の列、現在の電子メールアドレス、およびエントリ行の最後の列を保持する行が作成されます。 writerows()の機能は、すべての電子メールが読み込まれるまで機能し続けます(1つでも可能です)。

最後に、余分な空白を出力に保存するには、現在の電子メールアドレスに先にstrip()を使用して既存のスペースを削除し、format()を使用して電子メールアドレスの前後にスペースを追加します。

import csv  

with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output: 
    csv_input = csv.reader(f_input, delimiter='|') 
    csv_output = csv.writer(f_output, delimiter='|') 

    for row in csv_input: 
     csv_output.writerows([row[0], ' {} '.format(email.strip()), row[2]] for email in row[1].split(';')) 

注:PythonのCSVモジュールでは、区切り文字を複数の文字にすることはできません。

関連する問題