Python:ValueError:索引1处不支持的格式字符'''(0x27)
Posted
技术标签:
【中文标题】Python:ValueError:索引1处不支持的格式字符\'\'\'(0x27)【英文标题】:Python: ValueError: unsupported format character ''' (0x27) at index 1Python:ValueError:索引1处不支持的格式字符'''(0x27) 【发布时间】:2012-07-26 14:29:53 【问题描述】:我正在尝试使用 mysql 通过 Python 执行查询以搜索数据库中的 3 个表。每次我尝试将以下字符串作为查询执行时,它都会给我一个关于字符串连接的错误。
"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC"
这是它给我的错误:
ValueError: unsupported format character ''' (0x27) at index 1
如果我删除了它要求的字符,那么我还必须删除 %,这会阻止查询实际正常工作。我能做些什么来解决这个问题,因为我对 Python 还很陌生。
谢谢, 克里斯
【问题讨论】:
为您的 SQL 工具使用内置的字符串替换工具,而不是尝试使用标准 Python 字符串机制自己构建查询字符串。这样效果更好。你在用 MySQLdb 吗? 是的,我正在使用 MySQLdb,我在哪里可以找到这些替代工具? mysql-python.sourceforge.net/… 的文档说,“请注意,传递给 execute() 的查询字符串中的任何文字百分号都必须转义,即 %%。”你在用execute()
吗? @Silas 提到的替换工具显示在mysql-python.sourceforge.net/MySQLdb.html#some-examples
请检查以下答案是否仍然有效(适用于 Python 3.5+)。对我不起作用,它尝试了不同的方法。
【参考方案1】:
看起来 python 正在将 % 解释为类似 printf 的格式字符。尝试使用 %%?
"SELECT fileid
FROM files
WHERE description LIKE '%%%s%%'
OR filename LIKE '%%%s%%'
OR uploader LIKE '%%%s%%'
ORDER BY fileid DESC" % (search, search, search)
【讨论】:
非常感谢,成功了! :) 准确来说,MySQLdb 使用 % 运算符将参数放入查询中,因此查询字符串中的任何单个 % 字符都被解释为参数说明符的开始。为防止这种情况发生,请在查询中将 %% 用于 %。另请参阅相应的文档:string formatting【参考方案2】:仅供参考:我今天在 Python 3.6 中尝试了 @Pochi 的解决方案,但由于某种原因,它引发了意想不到的行为。我有两个和三个格式字符串参数,所以最后是:
% (Search, Search)
我的字符串(“搜索”)以大写的“S”开头。我收到错误消息:
ValueError: unsupported format character 'S' (0x53) at index 113
我把大写改为小写,报错:
TypeError: not enough arguments for format string
然后我只是将我的论点放在开头和结尾的 double %% 内,它就起作用了。所以我的代码看起来像:
"SELECT fileid
FROM files
WHERE description LIKE '%%search%%'
OR filename LIKE '%%search%%'
ORDER BY fileid DESC"
另一个解决方案是@Alice Yuan 提供的解决方案。她只是将唱歌的百分比翻了一番,而且效果很好。
【讨论】:
【参考方案3】:我的解决方案:
query = """SELECT id, name FROM provice WHERE name LIKE %s"""
cursor.execute(query, '%%%s%%' % name)
我认为解决这个问题很简单!
【讨论】:
Ehm,您知道%%%s%%' % name
部分是完全没有必要的吗?...查询的参数是%s
,它被ORM 或您使用的任何DB 抽象所取代。 ..【参考方案4】:
你可以这样试试:
SELECT fileid
FROM files
WHERE description LIKE '%%%%%s%%%%'
OR filename LIKE '%%%%%s%%%%'
OR uploader LIKE '%%%%%s%%%%'
ORDER BY fileid DESC" % (search, search, search)
【讨论】:
你能解释一下为什么这回答了这个问题吗?【参考方案5】:最简单的答案是将 LIKE 通配符 %
添加到值中。这会正确引用和转义 LIKE 模式。
在 Python 3.6+ 中,您可以使用 f 字符串在值中包含 LIKE 通配符 %
,从而将转义的字符串值正确插入 SQL:
# string to find, e.g.,
search = 'find-me'
# Parameterised SQL template
sql = """SELECT fileid FROM files
WHERE description LIKE %s OR filename LIKE %s OR uploader LIKE %s
ORDER BY fileid DESC"""
# Combine LIKE wildcard with search value
like_val = f'%search%'
# Run query with correctly quoted and escaped LIKE pattern
cursor.execute(sql, (like_val, like_val, like_val))
python3mysql-python
【讨论】:
以上是关于Python:ValueError:索引1处不支持的格式字符'''(0x27)的主要内容,如果未能解决你的问题,请参考以下文章
无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量