2016-11-04 80 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

你需要從一個CSV行讀取和寫入到另一個在更多的情況下,沒有多行:你可以拆分第二列,並在循環通過他們去,這樣的事情。電子郵件欄中的電子郵件。

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()函數一次寫入多行,對於通過拆分;字符上的第二列條目找到的每個電子郵件地址,都會有一個。

在這個例子中,它是使用一個生成器完成的。對於每個電子郵件地址,都會創建一行,其中包含輸入行中的第一列,當前電子郵件地址和輸入行中的最後一列。 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模塊不允許分隔符爲多個字符。