【问题标题】:Split 1 Column of CSV Into 3 Lists/Columns将 CSV 的 1 列拆分为 3 个列表/列
【发布时间】:2015-05-11 05:37:16
【问题描述】:

我有一个 CSV 文件,其中一列的数据类型为 500 封电子邮件:

[['Lindsey Jessica <xyz@icloud.com>'], 
['Jonathan Bob <a@xyz.edu>'],
['Homer Simpson <b@xyz.edu>']

我需要将它放入一个新的 CSV 文件中,其中 3 列由分隔

**FirstName** **LastName** **Email**

我设法将 CSV 的一列分成一个包含 3 个元素的列表:

["['Lindsey", 'M', "<lindsey@icloud.com>']", "['Jonathan", 'Andre', "<andre@xyz.edu>']", "['Greg", 'Kohl', "<kohls@gmail.com>']",...etc]

但现在我需要将它写入 CSV,使其看起来像这样:

      Col 1    Col 2   Col 3
Row 1 John     Doe     <mail-noreply@google.com>
Row 2 Joe      Doe     <mail-noreply@google.com>
Row 3 Jacob    Doe     <mail-noreply@google.com>

最好去掉电子邮件上的那些“”标志,这样我就可以将它们导入 mailchimp。但是我不知道如何将我的列表写成 3 列..

我的代码:

import csv

filename = ('email_list1.csv')

with open(filename, 'rt', encoding="utf-8") as f:
    reader = csv.reader(f)
    email_list = list(reader)
    email_list = (' '.join(str(v) for v in email_list)) ## Convert to string
    email_list = email_list.split() #Split into seperate elements in a list: first, last, email

## Trying to print out in columns instead of rows
out = open('email_list2.csv', 'w')
for element in email_list:
    out.write(element)
    #print (element)
    out.write('\n')
out.close()

我尝试使用 zip 功能无济于事,所以我不确定最好的方法是否是分成三个列表,如

firstname = []
lastname = []
email = []

或将它们写入 3 列。谢谢

【问题讨论】:

  • 输入在您的 csv 中实际上是什么样子的,它是用逗号分隔的吗?你不是已经有三列了吗?

标签: python list csv


【解决方案1】:
import csv

a=[['Lindsey Jessica <xyz@icloud.com>'], 
['Jonathan Bob <a@xyz.edu>'],
['Homer Simpson <b@xyz.edu>']]


mylist=[elem[0].split() for elem in a ]

"""Output[['Lindsey', 'Jessica', '<xyz@icloud.com>'], ['Jonathan', 'Bob', '<a@xyz.edu>'], ['Homer', 'Simpson', '<b@xyz.edu>']]"""

mylist1=[]
#removing '<' and'>' and creating a new list name mylist1
for elem in mylist:
    elem[2] = elem[2][1:len(elem[2])-1]
    mylist1.append(elem)
#writing to a csv file 
with open('out.csv', 'wb') as fp:
    myf = csv.writer(fp, delimiter=',')
    myf.writerows(mylist1)

【讨论】:

  • 首先,它给了我一个错误elem[2] = elem[2][1:len(elem[2])-1] IndexError: list index out of range。但是,如果您删除该行,只要您将其写入“w”而不是“wb”,它就会正确写入 CSV。此外,在 CSV 中,它会在每个真实行之后打印空白行。编辑:我意识到不是每个人都有姓氏,所以 elem[2] 有时不起作用,可能需要一个 IF 语句?
  • 对于给定的样本,上面的东西工作得很好......进行一些调整以满足您的要求。您可以添加一个 if 循环来检查姓氏
  • 有没有办法检查 elem[2] 是否真的存在于 for 循环中?就像它是否拥有一个值或像 C++ 中的 .empty() 一样为空?
  • if elem[2]: 如果它不为空,则评估为 true
【解决方案2】:

您的原始 csv 文件由空格分隔,您可以设置 delimiter=" " 然后将该行写入另一个 csv 文件,用 str.strip 删除 &lt;&gt;

import csv
with open("in.csv", 'rt') as f,  open('out.csv', 'wb') as out:
    wr = csv.writer(out)
    r = csv.reader(f, delimiter=" ")
    for row in r:
        row[2] = row[2].strip("<>")
        wr.writerow(row)

输出:

Lindsey,Jessica,xyz@icloud.com
Jonathan,Bob,a@xyz.edu
Homer,Simpson,b@xyz.edu

【讨论】:

    【解决方案3】:

    使用csv.writer

    ...
    writer = csv.writer(out, delimiter=',')
    ...
      writer.writerow(element)
    

    你也可以使用element[2].strip(['&lt;', '&gt;'])来摆脱

    【讨论】:

    • 这样做,out = open('email_list2.csv', 'w') writer = csv.writer(out, delimiter=',') for element in email_list: writer.writerow(element) out.close() 结果如下:i.imgur.com/MYrCWA5.png
    • 哦,好吧,你的列表分成三个元素完全是另外一回事
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2018-11-25
    • 2011-09-21
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多