字符串附加是非常奇怪的Python

时间:2015-10-08 16:21:14

标签: python string append

我试图创建一个快速的导入脚本,我发现了一些很奇怪的东西。

我做以下

print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp)

我希望结果是正常的,结果看起来很难

,15-08-2015 20:28:47)nentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8

任何人都可以解释为什么Timestamp值在前面而不是后面?

1 个答案:

答案 0 :(得分:1)

您的字符串值包含\r回车符。该字符指示打印位置到行的开头。您可以通过打印repr() function的输出来验证这一点,Change style and/or conditional style of the selection button的输出对任何不是可打印ASCII字符的字符使用Python转义序列。

TimeStamp值中删除字符;您可以使用str.replace()来执行此操作,例如:

TimeStamp = TimeStamp.replace('\r', '')

演示:

>>> value, TimeStamp = 41, '8\r,15-08-2015 20:28:47'
>>> print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp)
,15-08-2015 20:28:47)nentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8
>>> TimeStamp = TimeStamp.replace('\r', '')
>>> print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp)
insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8,15-08-2015 20:28:47)

请注意,您的值仍包含逗号!您可能在早些时候从某个文件或其他来源解析此数据时出错了。

另外,使用字符串格式化将数据插入到SQL语句中不是一个好主意。请改用SQL参数。这取决于您的数据库适配器,这意味着您在查询中使用?%s作为占位符,然后数据库适配器将正确引用值以防止SQL注入攻击并允许在查询处理中进行优化:

cursor.execute(
    "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,?,?)",
    (value, TimeStamp))

有关详细信息,请参阅数据库适配器文档。