在python 3中,我使用sqlite3和csv包来读取csv文件中的行,然后使用csv文件创建一个表。以一种不光彩的方式
self.cur.execute("drop table if exists tempTable")
with open(filename, 'r') as f:
reader = csv.reader(f)
#create the columns for the table
s = ""
headers = []
columns = self.format_headers(next(reader))
first = True
#issue table commands
for i in columns:
headers.append((i,i))
if first:
s+= str(i) + ' text'
first = False
else:
s += ', ' + str(i) + ' text'
final = "create table tempTable( " + s + ");"
print(final)
input()
self.cur.execute(final)
我在测试时发现了一个有趣的错误。
这是csv文件的第一行:
IP地址,资产名称,,,
对于csv,文件中包含额外的逗号itselt但没有数据...我的解析器尝试为它创建一个列。
阅读标题后,最终看起来像这样:
创建表tempTable(ip_address text,asset_name text,text,text,text);
...这是一个非法的sql命令
我可以为空白创建一个传递,但是这不会起作用,因为在某些情况下空白是合法的,并且csv文件依赖于这些数量的列以便数据按顺序排列。
rows = [row for row in reader]
for row in rows:
s = 'insert into tempTable({0}) values ({1});'
s = s.format(','.join('{!r}'.format(c) for c in columns), ','.join('{!r}'.format(cell) for cell in row))
self.cur.execute(s)
专栏示例:
1.1.1.1,abc123 ,,,
有没有更好的方法来创建表格?如果没有,我怎么能处理这个bug做出最小的改变?