21

Pythonで変数を一重引用符で囲むにはどうすればよいですか?とても簡単かもしれませんが、なかなかわかりません!変数をurlエンコードする必要がありますtermTermユーザーがフォームに入力し、URLエンコードされた関数に渡されterm=urllib.quote(term)ます。ユーザーが用語として「applecomputer」と入力した場合、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
4

6 に答える 6

38

3つの方法があります。

  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

「pythonsurroundstring」のようなものをグーグルで検索しているときにここに来て、時間に注意を払っている(または単に「最良の」解決策を探している)人のために

Python 3.6以降の環境では、はるかに使いやすいf文字列があり、私が読んだところによると、より高速であるとのことです。

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

私は、Pythonで文字列を「囲む」各メソッドのtimeitを実行することにしました。

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(("'", "'")))

(この場合、iterableパラメーターで指定されたすべての要素を1つの文字列に結合するための区切り文字としてjoin()使用termします。要素は2つしかないため、それらは単純にの1つのインスタンスにラップされますterm。)

それはかなり読みやすいですが、それでも私はそれをハックであり、他のオプションよりも読みにくいと思います。したがって、他の人が述べているように、文字列フォーマットを使用することをお勧めします。

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