사전을 Python에서 쿼리 문자열로 변환하는 방법은 무엇입니까?


답변:


158

파이썬 3

urllib.parse.urlencode(쿼리, doseq = False, [...])

변환 매핑 객체 또는 캐릭터 라인을 포함 또는 퍼센트로 인코딩 된 ASCII 텍스트 문자열, 객체를 바이트 수있는 두 가지 요소 튜플의 순서를.

Python 3 urllib.parse문서

A dict는 매핑입니다.

레거시 Python

urllib.urlencode( query[, doseq])
변환 매핑 객체 또는 "퍼센트 인코딩"문자열 개의 원소 튜플 시퀀스 ... 일련의 key=value쌍으로 구분 '&'문자 ...

Python 2.7 urllib문서


1
이것은 사실이지만에서 dict반환 cgi.parse_qs()된는 실제로 list"값"으로 s를 갖습니다 . 이를 바로 전달하면 매우 이상한 쿼리 문자열이 생성됩니다.
Johnsyweb

충분히 사실입니다. 그것은 첫 문장보다 더 많이 읽는 법을 가르쳐 줄 것입니다!
Johnsyweb


문제는 urlencode가 공백을 +로 변환한다는 것입니다. 이는 권장되지 않습니다.
user1633272

1
@ user1633272 : 누가 추천하지 않나요?
Ignacio Vazquez-Abrams

66

python3에서는 약간 다릅니다.

from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})

산출: 'pram1=foo&param2=bar'

python2 및 python3 호환성을 위해 다음을 시도하십시오.

try:
    #python2
    from urllib import urlencode
except ImportError:
    #python3
    from urllib.parse import urlencode

6

당신은 정확히 같은 것을 찾고 있습니다 urllib.urlencode()!

그러나 호출 할 때 parse_qs()(에서 구별됨 parse_qsl()) 사전 키는 고유 한 쿼리 변수 이름이고 은 각 이름에 대한 값 목록입니다 .

이 정보를에 전달 urllib.urlencode()하려면 이러한 목록을 "평탄화"해야합니다. 다음은 튜플의 목록을 이해하는 방법입니다.

query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)

15
아니면 통과 할 수 doseq=True있습니다.
Ignacio Vazquez-Abrams 2011 년

@downvoter :이 답변을 어떻게 개선 할 수 있습니까? 제가 쓴 지 6 년이되었습니다!
Johnsyweb

-1

아마도 다음과 같은 것을 찾고있을 것입니다.

def dictToQuery(d):
  query = ''
  for key in d.keys():
    query += str(key) + '=' + str(d[key]) + "&"
  return query

사전을 가져 와서 urlencode처럼 쿼리 문자열로 변환합니다. 쿼리 문자열에 마지막 "&"를 추가하지만 return query[:-1]문제가있는 경우 수정합니다.


4
str.join()아직 만났 나요? 어때요 urllib.quote_plus()?
Ignacio Vazquez-Abrams 2011 년

1
@garbados 솔루션은 간단한 경우에 작동합니다. 그러나, 모양이 urlencode에서 urllib.py왜 쿼리 문자열이 당신의 대답은 특히 (의 필요성을 알 수 있듯이 아주 간단하게, 때로는하지 않습니다 만드는 볼을 (그것이 당신의 파이썬으로하는 설치해야합니다)에 '인용'은 유효하지 않은 특정 문자 URL). @Ignacio는 또한 구현을 정리하고 수정하는 두 가지 함수를 참조했습니다.
안토니 쥐

아, 그렇습니다. 형편없는 구현에 대해 죄송합니다. 내가 한 번도 본 적이없는 질문에 더 신중하게 답해야한다는 것을 보여줍니다.
garbados

이것이 최선의 대답은 아니지만이 질문의 제목을 클릭했을 때보고 싶었던 것입니다. '&'로 구분 된 이름 = 값 쌍으로 변환해야하는 dict에 4 개의 항목 만 있습니다. 내 가치는 통제됩니다. str.join ()은 제 경우에는 편리하지만, 공개용 코드가 아니기 때문에 다시 quote_plus ()가 필요하지 않습니다. :) 감사합니다!
harperville 2014

1
@harperville 그러나 더 정확한 방법 ( from urllib.parse import urlencode; urlencode(your_dict))은 이것보다 짧고 쉽습니다! 나는 기존의 잘 디자인 된 바퀴에 접근하는 것이 비싸거나 불편할 때 조잡하게도 바퀴를 재발 명하는 것이 때때로 현명하다는 것을 인정할 것입니다. .
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.