SQLite3&Py:插入连字符字符串时出错

2024-06-24 13:51:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个简单的脚本,在这个脚本中,Python读取一堆以tab分隔的文件,然后逐行将行中的第一项输入到sqlite3表中。除实际数据外,该过程运行良好。发送给我的数据格式是123-4567890-1234567(3-7-7)。我没有在数据库中看到完整的字符串,而是得到字符串中三个数字的算术结果,即-5802334。你知道吗

我尝试过各种带引号的组合,例如Lines[0] = "'" + Lines[0] + "'"(我得到一个错误,最后一项是一个无法识别的标记)或Lines[0] = Lines[0].replace('-','_')(“OperationalError:unrecogned token:”114_“)
. 你知道吗

你能告诉我我做错了什么,和/或如何克服这个问题吗?你知道吗

这是我的完整代码:

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()

先谢谢你。你知道吗


Tags: csv字符串脚本datetimeosconnsqlite3dbfile
1条回答
网友
1楼 · 发布于 2024-06-24 13:51:14

底线是您不应该为此使用str.format,因为它是不安全的,而且在您的情况下,它也不会产生您期望的结果。你知道吗

幸运的是,这个问题早就解决了。对于您,只需将c.execute行更改为:

c.execute("INSERT OR IGNORE INTO OrderNums (Orderid, PONum, Timestamp)
          VALUES (?,?,?)",(Lines[0],Lines[0][12:],sTimestamp))

回顾文档可能是一个好主意-这里有一些非常有用的示例:

https://docs.python.org/3.5/library/sqlite3.html

相关问题 更多 >