পাইথন: json.loads 'u' এর সাথে উপসর্গের আইটেমগুলি ফেরত দেয়


161

আমি একটি জেএসএন এনকোডেড স্ট্রিং ফর্ম ওবজ-সি পাচ্ছি, এবং আমি নীচের কোডটির মতো একটি ডামি স্ট্রিং (আপাতত) ডিকোডিং করছি। আমার আউটপুট প্রতিটি আইটেমের উপস্থাপনের অক্ষর দিয়ে বেরিয়ে আসে:

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

জেএসএন কীভাবে এই ইউনিকোড চরটি যুক্ত করছে? এটি অপসারণ করার সর্বোত্তম উপায় কী?

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
পাইথন এখানে সমস্যা আছে। সব কিছুই চিল না। আমি যখন ফাইলটিতে এই স্ট্রিংগুলি লেখার চেষ্টা করি তখন পাইথন যে স্ট্রিংগুলি তৈরি করে সেগুলিতে আমি ত্রুটিগুলি পাচ্ছি। উদাহরণস্বরূপ, যখন পাইথন JSON থেকে "53" নেয় তখন এটি u'53 'তে পরিণত হয় এবং একটি ফাইলকে হেক্স অক্ষর u' \ xe1 'হিসাবে লেখার চেষ্টা করে যার ফলে পাইথন একটি পুরোপুরি ভাল স্ট্রিং নেয় এবং তার উপরে উঠতে পারে: জেএসএন: sa "sa_BstDeAv": "53", "sa_BwVUpMx" ... পাইথন: {usa_BstDeAv ': u'53', usa_BwVUpMx '... রচনায় ত্রুটি: মান ত্রুটি (' ascii 'কোডেক এনকোড করতে পারে না অক্ষর 5 'পজিশনে' 5 xe1 ': সীমানায় সীমানা নয় (128))
ডেভিড ওরি

@ জেনহাউসটি এখানে সঠিক উত্তরটি জেডি দ্বারা দেওয়া উত্তর আমি সত্যিই মনে করি আপনার এটি পরিবর্তন করা উচিত।
ডেকেল

উত্তর:


168

ইউ-উপসর্গটির অর্থ কেবল আপনার একটি ইউনিকোড স্ট্রিং রয়েছে। আপনি যখন সত্যিই স্ট্রিংটি ব্যবহার করবেন তখন এটি আপনার ডেটাতে উপস্থিত হবে না। মুদ্রিত আউটপুট দ্বারা নিক্ষেপ করবেন না।

উদাহরণস্বরূপ, এটি চেষ্টা করুন:

print mail_accounts[0]["i"]

আপনি একটি ইউ দেখতে পাবেন না।


5
আপনার উত্তর সবচেয়ে দরকারী এক আমি পেয়েছিলাম ছিল, এবং আমি মনে করি এই প্রশ্নের প্রশ্নকর্তা সত্যিই এটা প্রশংসা করত: stackoverflow.com/questions/956867/...
jimh

1
তোমাকে অনেক ধন্যবাদ ! আমি এতক্ষণ তোমার চিঠির জন্য বিভ্রান্ত ছিলাম
কেতান খানদাগলে

আপনি যদি এটি অনুলিপি করে পেস্ট করেন তবে uআপনার ডেটাতে প্রচুর পরিমাণে গুলি রয়েছে। সত্যি বলতে কী, uএটি ইউনিকোড স্ট্রিংয়ের নির্দেশক হিসাবে ছাপানো পাইথন সম্পর্কে সবচেয়ে খারাপ ভুল। একেবারে হাস্যকর। aযদি প্রতিটি স্ট্রিংয়ের আগে এটি ASCII হয় তবে একটি মুদ্রণ করবেন না কেন ? একটি iযদি এটা একটি পূর্ণসংখ্যা আছে?
স্নো ক্র্যাশ

পাইথন 2-এ, ইউনিকোড স্ট্রিংগুলি বাইট স্ট্রিংয়ের চেয়ে আলাদা ধরণের, সুতরাং ডেটা পুনরায় পোস্ট করাতে এটি নির্দেশ করার জন্য উপসর্গ অন্তর্ভুক্ত থাকে। বিষয়বস্তু কী হবে তা নয়, এটি প্রকারের। আপনি যদি পাইথন প্রোগ্রামে বিষয়বস্তুগুলি পেস্ট করে থাকেন তবে আপনার উপসর্গটি ঠিক আছে। যদি তা না হয় তবে সম্ভবত আপনি এর পরিবর্তে json.dumps () ব্যবহার করতে চান।
নেড ব্যাচেল্ডার

Json এর অভিধান অনুসন্ধান করতে আপনাকে স্ট্রিংটি ব্যবহার করতে হবে। আপনি তবে ডট অপারেটর ব্যবহার করতে পারবেন না।
ম্যাডডকস

151

মানুষ তো সবই সুন্দর। 'ইউ' একটি ভাল জিনিস, এটি সূচিত করে যে স্ট্রিংটি পাইথন ২.x তে ইউনিকোড টাইপের ছিল is

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


71
আমি এই এক খুব শীতল সুর পছন্দ। এমন একটি (সঠিক) উত্তরের জন্য +1 যা আমাকে হাসিয়ে দিয়েছে।
মিগিলসন

19
ঠিক, শীতল ... (┛◉Д◉) ┛ 彡 ┻━┻
ফুলভিও

31
এটি স্ট্যাক ওভারফ্লোতে আমি পড়েছি সবচেয়ে আরামদায়ক উত্তর।
aanrv

3
☮ ☮ ☮ শান্তি ☮ ☮ ☮
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.dumpsডিকটিকে একটি (জেএসওএন-এনকোডড) স্ট্রিংয়ে ফিরিয়ে দেয়। ওপি যা করতে চেয়েছিল তা নয়। -1।
মার্ক আমেরিকা

10
আপনি যদি এটি json.loads এর সাথে একত্রে ব্যবহার করেন তবে অভিধানটি এনকোড করা অক্ষর ছাড়াই ডায়াল্টিকে আউটপুট দেয় wihch প্রশ্নের উত্তর (এটি উপরের ডি 3 প্রিন্ট) উত্তরটি ভালভাবে পড়ুন!
বুধবার

8

uউপসর্গ যার অর্থ হল স্ট্রিং ইউনিকোড বদলে 8-বিট স্ট্রিং হয়। uউপসর্গটি না দেখানোর সর্বোত্তম উপায় হল পাইথন 3 এ স্যুইচ করা, যেখানে স্ট্রিংগুলি ডিফল্টরূপে ইউনিকোড। যদি এটি কোনও বিকল্প না হয় তবে strকনস্ট্রাক্টর ইউনিকোড থেকে 8-বিটে রূপান্তরিত করবে, সুতরাং ফলাফলের উপরে পুনরাবৃত্তভাবে লুপ করে রূপান্তর unicodeকরবে str। তবে স্ট্রিংগুলি ইউনিকোড হিসাবে রেখে দেওয়া সম্ভবত সেরা probably


8

ইউনিকোড এখানে একটি উপযুক্ত টাইপ। JSONDecoder ডক্স রূপান্তর টেবিল বর্ণনা করে এবং জেসন স্ট্রিং অবজেক্টস ইউনিকোড অবজেক্টে ডিকোড করা হয়েছে

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

"এনকোডিং এই উদাহরণ দ্বারা ডিকোড হওয়া কোনও স্ট্রিং অবজেক্টের ব্যাখ্যা করতে ব্যবহৃত এনকোডিং নির্ধারণ করে (ইউটিএফ -8 ডিফল্টরূপে)" "


7

এই 'ইউ' অক্ষরগুলিকে কোনও বস্তুর সাথে সংযুক্ত করা হচ্ছে তা বোঝায় যে বস্তুটি "ইউনিকোড" এ এনকোড হয়েছে।

আপনি যদি নিজের অবজেক্ট থেকে এই 'উ' অক্ষরগুলি সরাতে চান তবে আপনি এটি করতে পারেন:

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'}]

আমি প্রতিটি নবাগতকে কেবল এই স্ক্রিপ্টটি চেষ্টা করে দেখুন এবং ভয়েলা আপনার নিজের থেকে convert u'JSON আউটপুট থেকে রূপান্তর করার জন্য একটি স্ক্রিপ্ট আছে :) ... যদি কেউ কেবল স্ক্রিপ্টে স্টিডিন যুক্ত করতে পারে, এবং শেষে জসন ফর্ম্যাট করে, আপনি যাবার জন্য তৈরী!
জর্ডান জি

4

পাইগন loggingলাইব্রেরির সাথে লগের মধ্যে JSON ডেটা ক্যাপচার করার চেষ্টা করার সময় আমি এই সমস্যায় পড়েছিলাম deb পথ 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
এটি সত্যই সেরা উত্তর হওয়া উচিত, আপনি অনেকগুলি ক্ষেত্রে একেবারে "কেবল ছিটকে যান" না। এই জন্য আপনাকে অনেক ধন্যবাদ!
জেসিকা পেনেল

1

এটা চেষ্টা কর:

mail_accounts [0] .encode ( "ASCII")


কোনও ব্যাখ্যা ছাড়াই একটি উত্তর প্রায় অকেজো। এটি কেন সাহায্য করবে এমন কিছু তথ্য যুক্ত করার চেষ্টা করুন।
অভিলাষ চন্দ্রন

ব্যক্তিগতভাবে, আমি অত্যধিক অপ্রয়োজনীয় তথ্য বিভ্রান্ত করার সাথে দীর্ঘ উত্তরগুলি পাই। উপরের উত্তরগুলি ইতিমধ্যে ব্যাখ্যা করেছে যে মানটি ইউনিকোড এবং এ্যাস্কিতে রূপান্তরিত হওয়া দরকার তাই আমি সমস্ত কিছুই পুনরায় দিচ্ছি না। মান পাওয়ার সহজ উপায়টি দেখানো হচ্ছে। কারও যদি এই উত্তরটি ব্যবহার করতে সমস্যা হয় কেবল জিজ্ঞাসা করুন এবং আমি আরও ব্যাখ্যা করে খুশি! ধন্যবাদ
২ য় দর্শন ল্যাব

এটি হ'ল একমাত্র উত্তর যা সংক্ষিপ্তভাবে দেখায় যে কীভাবে প্রতিটি স্ট্রিংকে 'সাধারণ' করে পুনরায় কোড করা যায় (যা হাস্যকরভাবে অদক্ষ হওয়া উচিত) json.loads, json.dumps চক্রের মাধ্যমে।
এড র্যান্ডাল

0

কেবলমাত্র 'একক উদ্ধৃতি দিয়ে' প্রতিস্থাপন করুন ...

print (str.replace(mail_accounts,"u'","'"))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.