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)的主要内容,如果未能解决你的问题,请参考以下文章

Python中的ValueError,数组中的索引数不匹配

ValueError:索引长度不匹配:4064 与 1

无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量

ValueError:使用带有 seaborn 线图的索引时无法解释输入“索引”

ValueError:索引必须是单调的

ValueError:索引必须单调递增或递减