为何csv.writerows()将邮箱写入单行多列而非单列多行?
问题原因与解决方案
嗨,这个问题我碰到过好几次啦!核心原因是你传给csv.writerows()的数据结构不符合它的要求,咱们一步步拆解:
为什么会变成单行多列?
csv.writerows()的工作逻辑是:接收一个可迭代的「行对象」集合,每一个「行对象」(比如列表、元组)里的元素会对应CSV的一列。
如果你的代码是直接把排序后的邮箱列表(比如['a@xx.com', 'b@xx.com'])传给writerows(),那每个邮箱字符串本身是可迭代的(比如'a@xx.com'会被拆成['a', '@', 'x', 'x', '.', 'c', 'o', 'm']),这就会导致所有字符被当成同一行的不同列;或者如果你把所有邮箱塞进了一个元组/列表(比如('a@xx.com', 'b@xx.com')),那这个元组会被当成一行,每个邮箱对应一列,自然就变成单行多列了。
怎么改成单列多行?
你需要把每个邮箱单独包装成一个单元素的元组或列表,让writerows()识别每个邮箱是独立的一行。
举个贴合你流程的代码例子:
import csv import re from bs4 import BeautifulSoup # 假设你已经完成了提取、转小写、去重、排序的步骤,得到sorted_emails列表 sorted_emails = ['alice@example.com', 'bob@example.com', 'charlie@example.com'] # 关键:把每个邮箱包装成单元素元组,组成新的行集合 email_rows = [(email,) for email in sorted_emails] # 写入CSV with open('emails.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 可选:写入表头 writer.writerow(['Email Address']) # 传入包装好的行结构 writer.writerows(email_rows)
这样每个邮箱就会单独占一行,完美实现你想要的单列多行效果啦!
内容的提问来源于stack exchange,提问作者Jerusalem Programmer
相关产品推荐
相关产品推荐

