用Python将查询结果写入CSV

3 投票
2 回答
8865 浏览
提问于 2025-04-17 20:51

我正在写一个脚本,用来把查询结果写入一个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 个回答

1

像pymysql这样的模块遵循Python的数据库API。游标的fetchall()方法会返回一个元组的列表。每个元组代表数据库查询中的一行数据。把这个元组转换成字符串,可能得不到你想要的结果:

>>> str((1, ))
'(1,)'

writerow方法希望接收一个序列,序列中的每个元素会作为一行中的一个值输出,并根据你选择的格式进行适当的表示和分隔。

你现在的逻辑是循环遍历数据库查询返回的所有行。每次循环时,它会向一个列表中添加另一个(可能不正确的)值,打开一个文件进行写入,然后把当前的列表写出去。由于每次循环都会创建一个新文件,你只会看到最后一次循环写入的内容。

这里有段代码,可能会实现你想要的效果。

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()
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")

撰写回答