我正在做一个简单的脚本,其中Python读取一堆以制表符分隔的文件,然后逐行将该行中的第一项输入到一个sqlite3表中。除了实际数据之外,该过程运行良好。发送给我的数据格式为123-4567890-1234567 (3-7-7)。我没有在数据库中看到完整的字符串,而是得到了字符串中三个数字的算术结果,即-5802334。
我尝试了所有带引号的组合,比如Lines[0] = "'" + Lines[0] + "'" (我得到一个错误,最后一项是一个无法识别的令牌)或Lines[0] = Lines[0].replace('-','_') ("OperationalError: unrecognized token:"114_6555410_7421863")
。
你能告诉我我做错了什么吗,和/或如何克服这个问题?
下面是我的完整代码:
import sqlite3, os, fnmatch, csv, datetime
Homedir = os.path.expanduser('~')
DBFile = Homedir + '\\Desktop\\AmazonProg\\AmazonOrders.sqlite'
Rawpathin = '\\\\idc-v-lapedi01\\amtu2\\Data\\production\\reports\\'
#TableName = 'OrderNums'
#IdColumn = 'Orderid'
#POColumn = 'PONum'
sTimestamp = datetime.datetime.now().strftime('%Y%m%d%H%M')
Lines = []
conn = sqlite3.connect(DBFile)
c = conn.cursor()
Amzfiles=fnmatch.filter(os.listdir(Rawpathin), 'order*.txt')
for Files in Amzfiles:
with open(Rawpathin + Files, "r") as Source:
Reader = csv.reader(Source, delimiter = '\t')
for Lines in Reader:
if Lines[0] == 'order-id':
pass
elif len(Lines[0])== 19:
c.execute("INSERT OR IGNORE INTO OrderNums (Orderid, PONum, Timestamp) VALUES ({idf}, {v1}, {v2})".format(idf=Lines[0], v1=Lines[0][12:], v2 = sTimestamp))
else:
pass
conn.commit()
conn.close()提前谢谢你。
发布于 2016-09-01 00:26:32
底线是您不应该为此使用str.format,因为它不安全,而且在您的情况下,它也不会产生您期望的结果。
幸运的是,这个问题很久以前就解决了。对于您来说,只需将您的c.execute行更改为:
c.execute("INSERT OR IGNORE INTO OrderNums (Orderid, PONum, Timestamp)
VALUES (?,?,?)",(Lines[0],Lines[0][12:],sTimestamp))回顾一下这些文档可能是个好主意--这里有一些非常有用的例子:
https://stackoverflow.com/questions/39254365
复制相似问题