我正在做一个简单的脚本,其中Python读取一堆制表符分隔的文件,并逐行将行中的第一项输入到sqlite3表中。除实际数据外,该过程运行良好。发送给我的数据格式为123-4567890-1234567(3-7-7)。我没有看到数据库中的完整字符串,而是获得字符串中三个数字的算术结果,即-5802334。
我尝试了各种带引号的组合,例如Lines[0] = "'" + Lines[0] + "'"
(我收到的错误是最后一项是无法识别的令牌)或Lines[0] = Lines[0].replace('-','_')
("操作错误:无法识别的令牌:" 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()
提前谢谢你。
答案 0 :(得分:1)
底线是您不应该使用str.format
因为它不安全而且在您的情况下也不会产生您期望的结果。
幸运的是,很久以前这个问题就解决了。对您而言,只需将c.execute
行更改为:
c.execute("INSERT OR IGNORE INTO OrderNums (Orderid, PONum, Timestamp)
VALUES (?,?,?)",(Lines[0],Lines[0][12:],sTimestamp))
审核文档可能是一个好主意 - 包括一些非常有用的示例: