【问题标题】:Python shlex No closing quotations error - how to deal with?Python shlex 没有右引号错误——如何处理?
【发布时间】:2019-08-13 18:53:18
【问题描述】:

这个简单的代码:

s = "it's a nice day..."
s = shlex.split(s)

会导致ValueError: No closing quotation 错误:

Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    s = shlex.split(s)
  File "C:\Python\Python35-32\lib\shlex.py", line 273, in split
    return list(lex)
  File "C:\Python\Python35-32\lib\shlex.py", line 263, in __next__
    token = self.get_token()
  File "C:\Python\Python35-32\lib\shlex.py", line 90, in get_token
    raw = self.read_token()
  File "C:\Python\Python35-32\lib\shlex.py", line 166, in read_token
    raise ValueError("No closing quotation")
ValueError: No closing quotation

我认为' 有问题。我该如何处理?我从文件中读取了这一行,所以我不能在每个引号或其他内容之前输入\

【问题讨论】:

    标签: python python-3.x shlex


    【解决方案1】:

    您应该在拆分之前使用 shlex.quote(s) 安全地转义读取输入。如果您查看链接中的文档,quote 与拆分兼容。

    import shlex
    s = "it's a nice day..."
    sq = shlex.quote(s)
    print(sq)          #  '\'it\'"\'"\'s a nice day...\''
    shlex.split(sq)    # ["it's a nice day..."]
    

    使用quote 函数还将保护您免受“注入攻击”,如果您要接受不受信任(不是您自己的)输入,您应该注意这一点。请参阅文档以获取 rm -rf ~ 炸弹的示例!

    【讨论】:

    • 然后我想将输入保存在数据库中。我不认为我想将\ 保存在数据库中。有没有 shlex 函数可以逆转\\ 的效果?
    • 如果你保存shlex.split() 的输出,你不应该在你存储的字节中有反斜杠转义。虽然,如果您查询数据并希望对字符串执行进一步处理,则可能需要再次对其进行转义。
    【解决方案2】:

    应该被解析为 shell 输入的字符串(shlex 可以)不能有未转义的' 字符。您需要在输入中添加转义字符

    x = shlex.split("it\\'s a nice day...")
    print(x)
    

    给予:

    ["it's", 'a', 'nice', 'day...']
    

    您可以通过在输入中添加replace 来添加额外的\\

    s = s.replace("'", "\\'")
    

    【讨论】:

    • 然后我想将输入保存在数据库中。我不认为我想将\ 保存在数据库中。有没有 shlex 函数可以逆转\\ 的效果?
    • 是的。 s.replace("\\'", "'")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多