Python 向每个列表元素添加引号

Python 向每个列表元素添加引号,python,Python,我对python非常陌生。我需要一个简单而清晰的脚本来为每个列表元素添加引号。让我再解释一下。这是我的密码 parameters = ['a', 'b', 'c'] query = "SELECT * FROM foo WHERE bar IN (%s)" % (', '.join(parameters)) 我想用这个来查询。但结果是无效的查询。结果如下 SELECT * FROM foo WHERE bar IN (a, b, c, d) 我想这样: SELECT * FROM foo W

我对python非常陌生。我需要一个简单而清晰的脚本来为每个列表元素添加引号。让我再解释一下。这是我的密码

parameters = ['a', 'b', 'c']
query = "SELECT * FROM foo WHERE bar IN (%s)" % (', '.join(parameters))
我想用这个来查询。但结果是无效的查询。结果如下

SELECT * FROM foo WHERE bar IN (a, b, c, d)
我想这样:

SELECT * FROM foo WHERE bar IN ('a', 'b', 'c', 'd')

如何在连接元素时添加引号。

根据您的要求,使用以下命令:

parameters = ['a', 'b', 'c']
', '.join(map(lambda x: "'" + x + "'", parameters))

由于您正在创建SQL查询,请使用数据库库中有关输入的功能()。您不希望以这样的问题结束。

一个简单的解决方案是迭代您的
参数列表,并在每个元素的开头和结尾添加引号:

(', '.join('"' + item + '"' for item in parameters))
注意:这容易受到SQL注入的攻击(无论是巧合还是故意的)。更好的解决方案是让数据库引用并插入以下值:

query = "SELECT * FROM foo WHERE bar IN (%s)" % ','.join('?' * len(params))
cursor.execute(query, params)

阅读和正确处理报价更容易。

对于简单的参数,应使用以下方法:

query = "SELECT * FROM foo WHERE bar IN %s" % repr(tuple(map(str,parameters)))
当参数名称本身包含引号时,这可能会发生故障,因为转义规则不同。

通常(忽略SQL)


(lambda x:“+x+”,parameters)
会给他一个单引号,这是他要求的。@robert:使用内置函数的好的生成器表达式几乎总是比在CPython上的用户定义函数上使用map快,因为它几乎完全是在C中进行的。它也更具可读性,而且是一种类似Python的方式。不过还是很喜欢小波比桌子。@agf:是的,可读性更高;更快?不是在Python2上。比较
timeit(lambda:','.join(映射(lambda x:“+x+””,参数))
timeit(lambda:“,”.join(“+x+”,用于参数中的x))
。Python2.7.1+/Ubuntu11.04 64位上的
map()
版本快15-20%。Python 3.2上的generator版本快8%左右,同上。@Chris Morgan:我在64位Windows 7上使用Python 2.7.1 32位,generator版本快20%。编辑:第二次运行时,生成器版本的速度相同,但映射版本的速度要快得多。@Chris Morgan:下面我的答案中的版本是
timeit(lambda:“,”。join(parameters))
,比
timeit(lambda:“,”。join(map(lambda x:“+x+”,parameters))快5倍左右。
,虽然这是苹果和桔子的比较。在我看来,map/lambda一定是以不同的方式进行字符串连接的?此脚本生成无效的查询。它生成“SELECT*FROM foo WHERE bar IN('a'、'b'、'c')”,这与要求的匹配,并且可以工作(至少与我尝试的一个数据库,即sqlite3一起工作)。很抱歉,我使用的是PostgreSQL。它显示了我在((u'a',u'b',u'c',u'd')中从foo-WHERE-bar中选择*。无效查询。啊,您的参数数组具有unicode字符,而不是您要求的字符串。我已经修改了示例,将其转换为字符串。在任何情况下,如果你有复杂的字符串,你要做的远不止简单地加引号。我明白了。非常感谢你。对不起,我给了你折扣。抱歉。
[“““+item+””对于参数中的项]
会给他单引号,这是他要求的。要挑剔,您不需要列表[]这里:(“,”。join(“+item+””对于参数中的项))@Blender不,列表不会从该表达式中溢出。生成器将这些项设置为
字符串。join
请求它们,然后它们可以立即被垃圾回收。通过列表理解,它们都会被生成和存储,然后join会在列表上迭代,在对整个列表进行join之前,不会对它们进行垃圾收集。@agf,感谢您提供的信息。我不知道生成器表达式和列表理解在这方面是不同的。我将更新我的答案。@EsbenEickhardt:
psycopg2
使用
%s
(用于所有内容,而不仅仅是字符串)而不是
。Blender警告说,在SQL中使用参数是错误的,但在我看来,这还不够强烈。你应该问一个关于如何正确使用SQLI know中的参数的新问题。谢谢你的建议。我找到了一条非常安全的路。@Zeck什么是安全的路?
In [3]: print(' '.join('"%s"' % x for x in ['a', 'b']))                                                                                                                                              
"a" "b"