问题描述
我的代码是
import pymysql
conn=pymysql.connect(host=.................)
curs=conn.cursor()
import csv
f=open('./kospilist.csv','r')
data=f.readlines()
data_kp=[]
for i in data:
data_kp.append(i[:-1])
c = csv.writer(open("./test_b.csv","wb"))
def exportFunc():
result=[]
for i in range(0,len(data_kp)):
xp="select date from " + data_kp[i] + " where price is null"
curs.execute(xp)
result= curs.fetchall()
for row in result:
c.writerow(data_kp[i])
c.writerow(row)
c.writerow('\n')
exportFunc()
data_kp正在读取表名,表名是这样的(字符串,例如:a000010)我从这里收集表名。 然后,执行并获得结果。
我的代码的实际输出是..
我的期望是
(不是3列。有2000个表)
我以为我的代码接近答案了……但是它没有用。我的工作差不多完成了,但是我无法完成这一部分。 我用谷歌搜索了将近10个小时..我不知道如何..请帮助
我认为这部分有问题
for row in result:
c.writerow(data_kp[i])
c.writerow(row)
1楼
方法允许您在输出csv
文件中写一行 。
这意味着一旦调用了writerow
方法,该行即被写入,您将无法返回。
当您编写代码时:
for row in result:
c.writerow(data_kp[i])
c.writerow(row)
你是说:
“对于每个结果,写一条包含
data_kp[i]
的行,然后写一条包含row
。”
这样,一切都将垂直写入,而data_kp[i]
和row
交替。
令人惊讶的是,这并不是我们从您的实际输出中获得的。 我认为您已经更改了某些内容。 像这样:
c.writerow(data_kp[i])
for row in result:
c.writerow(row)
显然,这还不能完全解决您的问题:表名没有正确显示(每列一个字符),并且它们不是并排的。 因此,这里有两个问题:
1.在一个单元格中获取表名称,而不进行拆分
首先,让我们看一下有关的文档:
行必须是Writer对象的字符串或数字的可迭代项
但是您的data_kp[i]
是一个String
,而不是一个“可迭代的String
”。
这行不通!
但是您也没有任何错误,为什么?
这是因为python中的String
本身可能被视为String
的可迭代对象。
自己尝试:
for char in "abcde":
print(char)
现在,您可能已经了解了如何使这些工作正常进行:
# Give an Iterable containing only data_kp[i]
c.writerow([data_kp[i]])
现在,您的表名仅显示在1个单元格中! 但是我们还有另一个问题...
2.获取并排显示的表名
在这里,这是代码逻辑中的问题。 您正在浏览表名称,写包含它们的行,并希望它们并排写入并获得日期列!
您的代码需要重新考虑一下,因为csvwriter
并非用于编写列,而是用于编写行。
然后,我们将使用模块的zip_longest
函数。
有人会问我为什么不使用Python的zip
内置函数:这是因为据说列的大小不相等,并且一旦到达最短列表的末尾, zip
函数就会停止!
import itertools
c = csv.writer(open("./test_b.csv","wb"))
# each entry of this list will contain a column for your csv file
data_columns = []
def exportFunc():
result=[]
for i in range(0,len(data_kp)):
xp="select date from " + data_kp[i] + " where price is null"
curs.execute(xp)
result= curs.fetchall()
# each column starts with the name of the table
data_columns.append([data_kp[i]] + list(result))
# the * operator explode the list into arguments for the zip function
ziped_columns = itertools.zip_longest(*data_columns, fillvalue=" ")
csvwriter.writerows(ziped_columns)
注意:此处提供的代码未经测试,可能包含错误。 但是,您应该能够(通过使用我提供的文档)对其进行修复,以使其起作用! 祝好运 :)