2016-11-04 57 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模块不允许分隔符为多个字符。