파이썬 : 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.