用Python将查询结果写入CSV文件

3
我正在编写一个脚本,用于将查询结果行写入CSV文件。数据是电子邮件地址,像这样:

email1@mail.com

email2@mail.com

email3@mail.com

目前,我的代码将结果以以下方式写入CSV文件:

('email1@mail.com'), ('email2@mail.com'), ('email3@mail.com'),

如何使用下一行而不是行? 编辑: 看来我的查询给我括号内的数据,如('email1@mail.com')。
以下是代码:
import pymysql
import csv

db = pymysql.connect(host="localhost", port=3306, user="foo", passwd="bar", db="db")
cursor = db.cursor()

query3 = """SELECT email FROM tmp"""


cursor.execute(query)

data = cursor.fetchall()
list = []

for row in data :
  value = str(row)
  list.append(value)    
  file = open('file.csv', 'wb')
  data = csv.writer(file)
  data.writerow(list)

cursor.close()
db.close()
file.close()
2个回答

2
以下内容看起来可以解决您的问题:
f = csv.writer(open("file.csv", "w"))
for row in data:
    f.writerow([str(row)])

为了得到更详细/适当的解决方案,您需要提供更多详细信息,例如您的输入格式是什么样的,您希望输出文件看起来像什么(实际数据,而不是抽象的“a,b,c”)。
另外,不要将您的变量命名为listfile。这些名称会掩盖内置的列表/文件类型。
编辑:如果您只是每行写一个电子邮件地址,则您并未真正使用CSV,也不需要该模块。以下是我建议的做法:
f = open("file.txt", "w")
for i in email_addresses:
    f.write(i + "\n")

太好了,它解决了我的问题!我为数据类型编辑了我的帖子。 - user2094540
你说得完全正确。现在它可以正常工作了,我也明白原因了。谢谢! - user2094540

1

像pymysql这样的模块符合Python DB API。游标的fetchall()方法返回一个元组列表。每个元组表示来自数据库查询的单行数据。将其转换为字符串可能不会给你想要的结果:

>>> str((1, ))
'(1,)'
writerow方法期望得到一个序列,序列中的每个元素都会根据所选择的格式进行适当的表示和分隔符输出为行中的值。
您当前的逻辑循环遍历DB查询返回的所有行。每次循环时,它会向列表中添加另一个(可能不正确的)值,打开一个用于写入的文件,并将当前列表写出。由于每次迭代都会创建一个新文件,因此您只能看到最后一次迭代中写入的内容。
这是可能实现您想要的功能的代码。
import csv

data = [("first",), ("second",), ("Third",)]
list = []

file = open('file.csv', 'wb')
writer = csv.writer(file)
for row in data :
    writer.writerow(row)
file.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接