Ответ 1
Существует три способа:
-
конкатенация строк
term = urllib.quote("'" + term + "'")
-
форматирование строк старого стиля
term = urllib.quote("'%s'" % (term,))
-
форматирование строк в новом стиле
term = urllib.quote("'{}'".format(term))
Как заключить переменную в одинарные кавычки в python? Это, наверное, очень просто, но я не могу понять! Мне нужно URL-кодировать переменную term
. term
вводится в форме пользователем и передается функции, где он кодируется по URL term=urllib.quote(term)
. Если пользователь вводил "яблочный компьютер" в качестве своего термина, после URL-кодирования он будет "apple %20comptuer". Я хочу, чтобы этот термин был окружен одиночными кавычками перед кодировкой url, так что это будет "яблочный компьютер", а затем после 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
Существует три способа:
конкатенация строк
term = urllib.quote("'" + term + "'")
форматирование строк старого стиля
term = urllib.quote("'%s'" % (term,))
форматирование строк в новом стиле
term = urllib.quote("'{}'".format(term))
Вы можете просто использовать интерполяцию строк:
>>> term = "foo"
>>> "'%s'" % term
"'foo'"
def wrap_and_encode(x):
return encode("'%s'" % x)
Должно быть то, что вы ищете.
Что случилось с добавлением одинарных кавычек после кодирования url? Или, просто добавив их перед тем, как вы ввели функцию кодирования выше?
Я просто наткнулся на какой-то код, делающий это так:
term = urllib.quote(term.join(("'", "'")))
(В этом случае join()
использует term
как разделитель, чтобы объединить все элементы, которые были заданы в итерируемом параметре, в одну строку. Поскольку есть только два элемента, они просто обернуты вокруг одного экземпляра term
.)
Хотя это вполне читаемо, я все равно считаю его взломанным и менее читаемым, чем другие варианты. Поэтому я рекомендую использовать форматирование строк, как упоминалось другими:
term = urllib.quote("'{}'".format(term))
Для тех, кто придет сюда, придумывая что-то вроде "струны окружения python" и время добросовестно (или просто ищет "лучшее" решение).
Я собирался добавить, что теперь есть f-строки, которые для среды Python 3. 6+ легче использовать, и из того, что я читаю, они говорят, что они быстрее.
#f-string approach
term = urllib.parse.quote(f"'{term}'")
Я решил сделать timeit каждого метода "окружения" строки в 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, чем \
избегая всех цитат, поэтому дайте мне знать