পাইথনে জসন.ডম্প () এবং জসন.ডম্পস () এর মধ্যে পার্থক্য কী?


131

পাইথনে json.dump () এবং json.dumps () এর মধ্যে পার্থক্য জানতে আমি এই অফিসিয়াল ডকুমেন্টটিতে অনুসন্ধান করেছি । এটা স্পষ্ট যে তারা ফাইল রাইট বিকল্পের সাথে সম্পর্কিত।
তবে তাদের মধ্যে বিস্তারিত পার্থক্য কী এবং কোন পরিস্থিতিতে একজনের তুলনায় অন্যের চেয়ে বেশি সুবিধা রয়েছে?

উত্তর:


146

দস্তাবেজগুলি যা বলে তার চেয়ে অনেক বেশি যুক্ত করার দরকার নেই। আপনি যদি কোনও ফাইল / সকেটে বা যে কোনও কিছুতে JSON ডাম্প করতে চান তবে আপনার সাথে যাওয়া উচিত dump()। আপনার যদি কেবল স্ট্রিং হিসাবে (মুদ্রণ, বিশ্লেষণ বা যা কিছু জন্য) প্রয়োজন হয় তবে তা ব্যবহার করুনdumps() (ডাম্প স্ট্রিং)

এই উত্তরে আন্টি হাপালার উল্লেখ হিসাবে , ensure_asciiআচরণের ক্ষেত্রে কিছুটা ছোটখাটো পার্থক্য রয়েছে । এটি বেশিরভাগ অন্তর্নিহিত write()ফাংশনটি কীভাবে কাজ করে তার কারণে এটি পুরো স্ট্রিংয়ের চেয়ে অংশগুলিতে কাজ করে। সে সম্পর্কে আরও তথ্যের জন্য তার উত্তরটি দেখুন।

json.dump()

FP (a .writ () - সমর্থন ফাইল-এর মতো অবজেক্ট হিসাবে JSON ফর্ম্যাট স্ট্রিম হিসাবে আপত্তি সিরিয়াল করুন

যদি নিশ্চিত_অ্যাস্কিটি মিথ্যা হয় তবে fp তে লেখা কিছু অংশ ইউনিকোড উদাহরণ হতে পারে

json.dumps()

একটি JSON ফর্ম্যাটেড স্ট্রেমে আপত্তি সিরিয়াল করুন

যদি নিশ্চিত_অ্যাস্কিটি মিথ্যা হয় তবে ফলাফলটিতে অ-এএসসিআইআই অক্ষর থাকতে পারে এবং প্রত্যাবর্তনের মানটি ইউনিকোড উদাহরণ হতে পারে


সকেটের মাধ্যমে প্রেরণ করতে কীভাবে ডাম্প () ব্যবহার করবেন তা সম্পর্কে একটি উদাহরণ দেখাতে পারেন? আমি জানি যে আমি বামগুলিতে রূপান্তর করতে ডাম্প () এবং এনকোড () এর চেয়ে বেশি ব্যবহার করতে পারি, তবে কি আরও ছোট উপায় আছে?
ছেলে


20

স্মৃতি ব্যবহার এবং গতিতে।

আপনি যখন jsonstr = json.dumps(mydata)এটি কল করেন তখন প্রথমে আপনার ডেটাটির সম্পূর্ণ কপি মেমরিতে তৈরি করে এবং কেবলমাত্র তখনই আপনি file.write(jsonstr)এটি ডিস্কে রেখে দেন। সুতরাং এটি একটি দ্রুত পদ্ধতি তবে আপনার যদি সংরক্ষণ করার জন্য একটি বড় টুকরো ডেটা থাকে তবে সমস্যা হতে পারে।

যখন আপনি কল করবেন json.dump(mydata, file)- 'গুলি' ছাড়াই, নতুন মেমরি ব্যবহার করা হয় না, কারণ খণ্ডগুলি ডেটা ফেলে দেয়। তবে পুরো প্রক্রিয়াটি প্রায় 2 গুণ ধীর।

উত্স: আমি উত্স কোডটি যাচাই করেছি json.dump()এবং json.dumps()এবং উভয় time.time()রূপটিও পরীক্ষা করেছিলাম সময়টি পরিমাপ করে এবং এইচটিপিতে মেমরির ব্যবহার দেখে।


6

পাইথন 2 এর একটি উল্লেখযোগ্য পার্থক্য হ'ল আপনি যদি ব্যবহার করেন ensure_ascii=False,dump ফাইলে হবে সঠিকভাবে লেখার UTF-8 এনকোড তথ্য (যদি না আপনি বর্ধিত অক্ষর আছে যা হল UTF-8 নও সঙ্গে 8-বিট স্ট্রিং ব্যবহার):

dumpsঅন্য দিকে, সঙ্গে ensure_ascii=Falseএকটি তৈরী করতে পারে strবা unicodeঠিক কি ধরনের স্ট্রিং জন্য ব্যবহার উপর ভিত্তি করে:

এই রূপান্তর টেবিলটি ব্যবহার করে একটি JSON ফর্ম্যাট স্ট্রের আপত্তি সিরিয়াল করুন। যদি নিশ্চিত_অ্যাস্কিটি মিথ্যা হয় তবে ফলাফলটিতে অ-এএসসিআইআই অক্ষর থাকতে পারে এবং প্রত্যাবর্তনের মানটি উদাহরণ হতে পারেunicode

(জোর আমার)। এটি এখনও একটি হতে পারে নোট করুনstr উদাহরণ ।

কোন ফর্ম্যাটটি ফিরে এসেছে এবং সম্ভবত খেলছে তা পরীক্ষা না করেই আপনি কাঠামোটিকে ফাইলে সংরক্ষণ করতে এর রিটার্ন মানটি ব্যবহার করতে পারবেন না unicode.encode

অবশ্যই পাইথন 3 এ আর বৈধ উদ্বেগ নয়, যেহেতু এই 8-বিট / ইউনিকোড বিভ্রান্তি আর নেই।


loadবনাম হিসাবে loads, পুরো ফাইলটিকে একটি JSON নথি হিসাবে loadবিবেচনা করে , তাই আপনি এটি কোনও একক ফাইল থেকে একাধিক নিউলাইন সীমাবদ্ধ JSON নথি পড়তে ব্যবহার করতে পারবেন না।


পাইথন স্ট্রিং অবজেক্টে তৈরি সমস্ত পাঠ্য ইউনিকোড, তবে জেনারিকভাবে এটি ধরে নেওয়া কি নিরাপদ? অর্থাত্ কোনও ফাইল থেকে সামগ্রী লোড করার সময়?
João Gonçalves

@ জোওগোনালভের অর্থ এটি আপনি পাঠ্যের সাথে বাইনারি ডেটা মেশাতে পারবেন না যাতে পাইথন নীরবে এটি অনুমোদন করে। যেমন json.dumps([b'123'])-> TypeError
এন্টি হাপাল

@ জোওগোনালভসও নোট করেন যে জেএসওএন নথির স্ট্রিংগুলি ইউনিকোড হতে হবে এবং অবশ্যই ইউটিএফ -8, ইউটিএফ -16 বা ইউটিএফ -32
কোনওটি

1
যে ব্যাখ্যা জন্য ধন্যবাদ! তোলে ইন্দ্রিয়
João Gonçalves
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.