파이썬 : json.loads는 접두사 'u'를 반환합니다


161

Obj-C 형식의 JSON 인코딩 문자열을 수신하고 아래 코드와 같이 더미 문자열 (현재)을 디코딩하고 있습니다. 내 출력에는 각 항목 앞에 문자 'u'가 있습니다.

[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...

JSON은이 유니 코드 문자를 어떻게 추가합니까? 그것을 제거하는 가장 좋은 방법은 무엇입니까?

mail_accounts = []
da = {}
try:
    s = '[{"i":"imap.gmail.com","p":"aaaa"},{"i":"imap.aol.com","p":"bbbb"},{"i":"333imap.com","p":"ccccc"},{"i":"444ap.gmail.com","p":"ddddd"},{"i":"555imap.gmail.com","p":"eee"}]'
    jdata = json.loads(s)
    for d in jdata:
        for key, value in d.iteritems():
            if key not in da:
                da[key] = value
            else:
                da = {}
                da[key] = value
        mail_accounts.append(da)
except Exception, err:
    sys.stderr.write('Exception Error: %s' % str(err))

print mail_accounts

7
파이썬에는 문제가 있습니다. 모든 것이 차갑지 않습니다. 이 문자열을 파일에 쓰려고 할 때 Python이 생성하는 문자열에 오류가 발생합니다. 예를 들어 python이 JSON에서 "53"을 가져 오면 u'53 '으로 변환하고 16 진 문자 u'\ xe1 '로 파일에 쓰려고 시도합니다. 이로 인해 Python은 완벽하게 좋은 문자열을 가져 와서이를 푸시합니다. JSON : { "sa_BstDeAv": "53", "sa_BwVUpMx"... PYTHON : {u'sa_BstDeAv ': u'53', u'sa_BwVUpMx '... ERROR ON WRITE : ERROR ON WRITE : 값 오류 ('ascii '코덱을 인코딩 할 수 없음 위치 5의 문자 u '\ xe1': 서 수가 범위 내에 있지 않음 (128)
David Urry

@ janehouse 정답은 jdi의 대답입니다. 정말로 변경해야한다고 생각합니다.
Dekel

답변:


168

u- 접두사는 단지 유니 코드 문자열이 있음을 의미합니다. 실제로 문자열을 사용하면 데이터에 표시되지 않습니다. 인쇄 된 출력물에 버리지 마십시오.

예를 들어 다음을 시도하십시오.

print mail_accounts[0]["i"]

당신은 u를 볼 수 없습니다.


5
귀하의 답변은 내가 얻은 가장 유용한 답변
이었으며이

1
정말 고맙습니다 ! 나는 오랫동안 편지 ''U에 대해 혼란스러워했다
케탄 khandagale

복사하여 붙여 넣는 경우를 제외하고는 u데이터에 막대한 양이 있습니다. 솔직히 a u를 인쇄 하여 유니 코드 문자열임을 나타내는 것은 파이썬에서 최악의 실수 중 하나입니다. 어리석은 말이야 aASCII 인 경우 모든 문자열 앞에 인쇄하지 않는 이유는 무엇 입니까? i이 정수인지?
Snowcrash

Python 2에서 유니 코드 문자열은 바이트 문자열과 다른 유형이므로 데이터 repr에이를 나타내는 접두사가 포함됩니다. 내용이 무엇인지에 관한 것이 아니라 유형에 관한 것입니다. 내용을 파이썬 프로그램에 다시 붙여 넣으면 u 접두사가 좋습니다. 그렇지 않다면, 대신 json.dumps ()를 사용하고 싶을 것입니다.
Ned Batchelder

json 사전을 검색하려면 문자열을 사용해야합니다. 그러나 도트 연산자를 사용할 수 없습니다.
Maddocks

151

모든 것이 멋지다. 'u'는 좋은 것입니다. 파이썬 2.x에서 문자열이 유니 코드 유형임을 나타냅니다.

http://docs.python.org/2/howto/unicode.html#the-unicode-type


71
나는 이것의 매우 차가운 색조를 좋아한다. 나를 웃게 만든 (올바른) 답변은 +1입니다.
mgilson

19
그냥, 진정 ... (┛◉Д◉) ┛ 彡 ┻━┻
fulvio

31
이것이 내가 OverOver에서 읽은 가장 편안한 답변이었습니다.
aanrv

3
☮ ☮ ☮ Peace ☮ ☮ ☮
sr9yar

54

d3아래 의 인쇄는 당신이 찾고있는 것입니다 (덤프와로드의 조합입니다) :)

갖는 :

import json

d = """{"Aa": 1, "BB": "blabla", "cc": "False"}"""

d1 = json.loads(d)              # Produces a dictionary out of the given string
d2 = json.dumps(d)              # Produces a string out of a given dict or string
d3 = json.dumps(json.loads(d))  # 'dumps' gets the dict from 'loads' this time

print "d1:  " + str(d1)
print "d2:  " + d2
print "d3:  " + d3

인쇄물:

d1:  {u'Aa': 1, u'cc': u'False', u'BB': u'blabla'}
d2:  "{\"Aa\": 1, \"BB\": \"blabla\", \"cc\": \"False\"}"
d3:  {"Aa": 1, "cc": "False", "BB": "blabla"}

3
응? json.dumpsdict를 (JSON 인코딩) 문자열로 다시 변환합니다. 그것은 OP가 원했던 것이 아닙니다. -1.
Mark Amery

10
그러나 json.loads와 함께 사용하면 인코딩 된 문자없이 사전을 출력합니다 .wihch는 질문에 대한 답변입니다 (위의 d3 인쇄).
머큐리

8

u프리픽스 수단 해당 문자열 유니보다는 8 비트 스트링임을. u접두사를 표시하지 않는 가장 좋은 방법 은 문자열이 기본적으로 유니 코드 인 Python 3으로 전환하는 것입니다. 옵션이 아닌 경우 str생성자는 유니 코드에서 8 비트로 변환되므로 결과를 반복적으로 반복하고로 변환 unicode하면 str됩니다. 그러나 문자열을 유니 코드로 그대로 두는 것이 가장 좋습니다.


8

유니 코드는 적절한 유형입니다. JSONDecoder 문서는 변환 테이블을 설명하고 JSON 문자열 오브젝트가 유니 코드 오브젝트로 디코딩됨을 나타냅니다.

https://docs.python.org/2/library/json.html#encoders-and-decoders

JSON                    Python
==================================
object                  dict
array                   list
string                  unicode
number (int)            int, long
number (real)           float
true                    True
false                   False
null                    None

"인코딩은이 인스턴스에서 디코딩 된 str 객체를 해석하는 데 사용되는 인코딩을 결정합니다 (기본적으로 UTF-8)."


7

객체에 추가되는 'u'문자는 객체가 "유니 코드"로 인코딩되었음을 나타냅니다.

객체에서 해당 'u'문자를 제거하려면 다음을 수행하십시오.

import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars

파이썬 쉘에서 체크 아웃하자

>>> import json, ast
>>> jdata = [{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}]
>>> jdata = ast.literal_eval(json.dumps(jdata))
>>> jdata
[{'i': 'imap.gmail.com', 'p': 'aaaa'}, {'i': '333imap.com', 'p': 'bbbb'}]

나는 모든 초보자가 단순히이 스크립트를 시도하고 ~ from ~ u'JSON 출력을 변환하는 스크립트를 가지고 있다고 제안합니다 :) ... 스크립트에 stdin 만 추가 할 수 있고 마지막에 json 형식 만 있으면 갈 준비가되었습니다!
Jordan Gee

4

logging디버깅 및 문제 해결을 위해 Python 라이브러리 를 사용하여 로그에서 JSON 데이터를 캡처하려고 할 때이 문제가 계속 발생했습니다 . u텍스트를 복사하여 코드 어딘가에 붙여 넣으려는 경우 문자를 얻는 것이 정말 번거 롭습니다.

모든 사람이 말했듯이, 이것은 유니 코드 표현이기 때문에 json.loads()처음부터 문자열에서 데이터를로드 하는 데 사용한 사실에서 비롯된 것일 수 있습니다 .

u접두사 없이 JSON 표시를 로그에 표시하려면 로그 json.dumps()아웃하기 전에 사용 하는 것이 좋습니다. 예를 들면 다음과 같습니다.

import json
import logging

# Prepare the data
json_data = json.loads('{"key": "value"}')

# Log normally and get the Unicode indicator
logging.warning('data: {}'.format(json_data))
>>> WARNING:root:data: {u'key': u'value'}

# Dump to a string before logging and get clean output!
logging.warning('data: {}'.format(json.dumps(json_data)))
>>> WARNING:root:data: {'key': 'value'}

1
이것은 실제로 가장 좋은 대답이어야합니다. 'u'는 많은 맥락에서 "지워지지"않습니다. 정말 감사합니다!
Jessica Pennell 2018 년

1

이 시도:

mail_accounts [0] .encode ( "ascii")


설명이없는 대답은 거의 쓸모가 없습니다. 이것이 도움이되는 이유와 같은 정보를 추가하십시오.
Abhilash Chandran

개인적으로, 나는 너무 많은 불필요한 정보 혼란으로 긴 답변을 찾습니다. 위의 답변은 이미 값이 유니 코드이며 ascii로 변환해야한다고 설명하므로 모든 것을 반복하지는 않습니다. 가치를 얻는 더 간단한 방법을 보여 주기만하면됩니다. 이 답변을 사용하는 데 문제가있는 사람은 물어보고 더 설명해 드리겠습니다! 감사합니다
2nd Sight Lab

이것은 실제로 (정말 비효율적 인) json.loads, json.dumps 사이클을 거치지 않고 각 문자열을 '정상'으로 다시 코딩하는 방법을 간결하게 보여주는 유일한 대답입니다.
Ed Randall

0

u '를 작은 따옴표로 바꾸십시오 ...

print (str.replace(mail_accounts,"u'","'"))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.