21

如何在 python 中用单引号将变量括起来?这可能很简单,但我似乎无法理解!我需要对变量进行 url 编码termTerm由用户在表单中输入,并传递给它是 url-encoded 的函数term=urllib.quote(term)。如果用户输入“apple computer”作为他们的术语,则在 url 编码后它将是“apple%20comptuer”。我想要做的是在 url 编码之前用单引号将术语括起来,这样它就会是“'apple computer'”,然后在 url 编码“%23apple%20computer%23”之后。我需要将该术语传递给一个 url,除非我使用这种语法,否则它将不起作用。有什么建议么?

示例代码:

import urllib2
import requests    

def encode():
        import urllib2
        query= avariable #The word this variable= is to be enclosed by single quotes
        query = urllib2.quote(query)
        return dict(query=query)

def results():

    bing = "https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Web?Query=%(query)s&$top=50&$format=json"
    API_KEY = 'akey'

    r = requests.get(bing % encode(), auth=('', API_KEY))
    return r.json
4

6 回答 6

38

有以下三种方式:

  1. 字符串连接

    term = urllib.quote("'" + term + "'")
    
  2. 旧式字符串格式

    term = urllib.quote("'%s'" % (term,))
    
  3. 新式字符串格式化

    term = urllib.quote("'{}'".format(term))
    
于 2012-07-05T19:21:37.533 回答
10

您可以只使用字符串插值:

>>> term = "foo"
>>> "'%s'" % term
"'foo'"
于 2012-07-05T19:18:18.443 回答
3
def wrap_and_encode(x):
    return encode("'%s'" % x)

应该是你正在寻找的。

于 2012-07-05T19:18:15.637 回答
3

对于那些在谷歌上搜索“python环绕字符串”之类的东西并且对时间很认真(或只是在寻找“最佳”解决方案)的人来说

我要补充一点,现在有用于 Python 3.6+ 环境的f-strings更容易使用,而且从我读到的内容来看,它们说它们更快。

#f-string approach
term = urllib.parse.quote(f"'{term}'")

我决定对python中“包围”字符串的每种方法进行一次计时。

import timeit

results = {}

results["concat"] = timeit.timeit("\"'\" + 'test' + \"'\"")
results["%s"] = timeit.timeit("\"'%s'\" % ('test',)")
results["format"] = timeit.timeit("\"'{}'\".format('test')")
results["f-string"] = timeit.timeit("f\"'{'test'}'\"") #must me using python 3.6+
results["join"] = timeit.timeit("'test'.join((\"'\", \"'\"))")

for n, t in sorted(results.items(), key = lambda nt: nt[1]):
    print(f"{n}, {t}")

结果:

concat, 0.009532792959362268
f-string, 0.08994143106974661
join, 0.11005984898656607
%s, 0.15808712202124298
format, 0.2698059631511569

奇怪的是,我每次运行它时都得到连接比 f-string 快,但是您可以复制和粘贴以查看您的字符串/使用是否有不同的工作方式,也可能有更好的方法将它们放入 timeit 比\转义所有引号,让我知道

于 2018-12-03T10:30:03.820 回答
2

在 url 编码后添加单引号有什么问题?或者,只是在上面的编码函数中添加它们?

于 2012-07-05T19:18:18.717 回答
0

我只是偶然发现了一些这样做的代码:

term = urllib.quote(term.join(("'", "'")))

(在这种情况下,join()用作term分隔符,将可迭代参数中给出的所有元素组合成一个字符串。由于只有两个元素,因此它们只是简单地包裹在 . 的一个实例周围term。)

尽管它的可读性很强,但我仍然认为它是一种 hack,并且比其他选项可读性差。因此,我建议使用其他人提到的字符串格式:

term = urllib.quote("'{}'".format(term))
于 2014-07-13T18:32:53.723 回答