问题 如何从pyodbc结果行创建逗号分隔的字符串?


我有一个存储在cursor.rows中的行的结果集,这些行是从pyodbc.cursor.execute命令返回的。解压缩这些数据并将其放入逗号分隔字符串列表(或解压缩到自定义对象)的最快方法是什么?

目前我正在做以下事情:

cursor.execute(query_str)
f = open(out_file, 'w')
for row in cursor:
    f.write(','.join([str(s) for s in row]))
    f.write('\n')

这需要每行130毫秒,这似乎是一个非常昂贵的操作。我怎样才能加快速度呢?


9433
2018-06-28 21:57


起源

每排130毫秒对我来说似乎很便宜。花在哪里?数据库?网络? OS?您的要求中规定了什么时间表? - S.Lott
返回的查询大约有6000条记录。在Win XP,后期模型dell工作站(T5500)上将它们写入文件大约需要5-6分钟,因此它不是处理器限制。时间是在连接中花费的([str(s)for s in row]),它为记录中的所有元素调用str函数。我也试过限制返回的列数,从25减少到大约15,这实际上稍慢。 - DonQuixote
如果较少的列较慢,则必须研究每个列的数据类型。所需要的只是一个巨大的BLOB列,它一直占用并且非常慢。请继续收集数据,然后再浪费时间进行“优化”。请 更新 你的发现的问题。请避免评论您自己的问题。请用它更新 所有 事实。 - S.Lott


答案:


我会用的 csv 模块:

import csv

cursor.execute(query_str)
with open(out_file, 'w') as f:
    csv.writer(f, quoting=csv.QUOTE_NONE).writerows(cursor)

请注意,如果你 csv.QUOTE_NONE 一个 csv.Error 如果数据字段中有逗号,则引发此异常。理智的方式是 csv.QUOTE_MINIMAL 至少。


12
2018-06-28 23:17



+1。它也会 帮助设定 quotechar 一个空字符串 - iruvar