পাইথন 3 দিয়ে পাইথন 2 অবজেক্টটি আনছি


129

আমি ভাবছি পাইথন ২.৪-তে পাইথন ২.৪-তে আচারযুক্ত কোনও বস্তু লোড করার কোনও উপায় আছে কিনা?

আমি আপ টু ডেট করার জন্য সংখ্যক সংস্থার লিগ্যাসি কোডটিতে 2to3 চালিয়ে যাচ্ছি।

এটি করার পরে, ফাইলটি চালানোর সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

  File "H:\fixers - 3.4\addressfixer - 3.4\trunk\lib\address\address_generic.py"
, line 382, in read_ref_files
    d = pickle.load(open(mshelffile, 'rb'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal
not in range(128)

যুক্তিযুক্ত আচারযুক্ত বস্তুর দিকে তাকানো, এটি একটি dictইন এর dict, কী এবং প্রকারের মানগুলি অন্তর্ভুক্ত str

সুতরাং আমার প্রশ্নটি হল: অজগর ৩.৪ সহ মূলত পাইথন ২.৪-তে আচারযুক্ত কোনও বস্তু লোড করার কোনও উপায় আছে কি?


1
পাইথন ২.৪ এর jsonমডিউলটি রয়েছে? সম্ভবত আপনি একটি ২.৪ স্ক্রিপ্ট লিখতে পারেন যা অবজেক্টটিকে আনপিকল করে এবং এটি একটি জসন অবজেক্ট হিসাবে সংরক্ষণ করে এবং তারপরে একটি 4.৪ স্ক্রিপ্ট লিখতে পারে যা জসন অবজেক্টটি পড়ে এবং এটি একটি 3.4- সামঞ্জস্যপূর্ণ আচার অবজেক্ট হিসাবে সংরক্ষণ করে। এটি এমন এককালীন ক্রিয়াকলাপ হবে যা আপনি আপনার সমস্ত আচার ফাইলগুলিতে চালান।
কেভিন

আমি অনুরূপ রেখাগুলি নিয়ে ভাবছিলাম, এগুলি বিবেচনা করে আমি এই ফাইলটিকে ডাইস বলে মনে করি আমি কেবল একটি ফাইলের জন্য সিএসএসআউটআউট পরিবর্তন করতে এবং সেগুলি মুদ্রণ করতে পারি, তবে আমি দেখতে চাই যে আমি প্রথমে সেগুলি লোড করতে পারি কিনা
এনডেভক্স

সম্পর্কিত প্রশ্ন বিশেষভাবে ডেটটাইমগুলির সাথে সম্পর্কিত: স্ট্যাকওভারফ্লো.
জন ওয়াই

উত্তর:


189

আপনি বলতে হবে pickle.load()পাইথন করার পাইথন bytestring তথ্য রূপান্তর করতে কিভাবে 3 স্ট্রিং, অথবা আপনি বলতে পারেন pickleতাদের বাইট হিসাবে ত্যাগ করার।

ডিফল্ট হ'ল ASCII হিসাবে সমস্ত স্ট্রিং ডেটা চেষ্টা এবং ডিকোড করা এবং এটি ডিকোডিং ব্যর্থ হয়। pickle.load()ডকুমেন্টেশন দেখুন :

ঐচ্ছিক শব্দ আর্গুমেন্ট fix_imports , এনকোডিং এবং ত্রুটি , যা পাইথন 2. যদি দ্বারা উত্পন্ন জরান স্ট্রিম জন্য নিয়ন্ত্রণ সামঞ্জস্য সমর্থন করতে ব্যবহার করা হয় fix_imports সত্য, জরান নতুন পাইথন 3. দ্য ব্যবহৃত নাম পুরানো পাইথন 2 নাম ম্যাপ করার চেষ্টা করবে এনকোডিং এবং ত্রুটি কিভাবে ডিকোড 8-বিট স্ট্রিং পাইথন 2 দ্বারা জরা ইনস্ট্যান্সের জরান বলছি; এই ডিফল্ট যথাক্রমে 'ASCII' এবং 'কঠোর'। এনকোডিং 'বাইট' বাইট বস্তু হিসেবে এই 8-বিট স্ট্রিং দৃষ্টান্ত পড়তে হতে পারে।

এনকোডিংটি সেট করা latin1আপনাকে সরাসরি ডেটা আমদানি করতে দেয়:

with open(mshelffile, 'rb') as f:
    d = pickle.load(f, encoding='latin1') 

তবে আপনাকে যাচাই করতে হবে যে ভুল কোডেক ব্যবহার করে আপনার কোনও স্ট্রিং ডিকোড করা হয়নি; ল্যাটিন -১ কোনও ইনপুটটির জন্য কাজ করে কারণ এটি বাইটের মানগুলি প্রথম 256 ইউনিকোড কোডপয়েন্টগুলিতে 0-255 মানচিত্র করে।

বিকল্পটি encoding='bytes'হ'ল ডেটা লোড করা এবং তার bytesপরে সমস্ত কী এবং মানগুলি ডিকোড করা ।

দ্রষ্টব্য যে পাইথন সংস্করণ অবধি ৩.6.৮, ৩.7.২datetime এবং ৩.৮.০ এর আগে পাইথন ২ অবজেক্টের ডেটা আন-পিকেলিং আপনি ব্যবহার না করলেই ভাঙা হবে encoding='bytes'


1
কীভাবে এটি পাইথন 2 এর সাথে পিছনে সামঞ্জস্যপূর্ণ হতে পারে? দৃশ্যত, এনকোডিং যুক্তি না পাইথন 2. জন্য উপস্থিত থাকলে
EpicAdv

2
@ এপিকএডিভি: আপনার এই কোডটি পাইথন 2 এর সাথে সামঞ্জস্য করার দরকার নেই; এই প্রশ্নটি কীভাবে পাইথন 2 আচারে পাইথনটি লোড করতে হয় 3 পাইথন 2 এর encodingজন্য মূলত কীওয়ার্ডটি ড্রপ করুন
মার্টিজান পিটারস

10
@ এপিকএডিভি: আপনি একটি পিক_অপশন অভিধান তৈরি করতে পারেন যা পাইথন 2 এর জন্য ফাঁকা বা 'encoding': 'latin1'আচারে ** পিকেল_ওশন পাঠাতে পারেন। এইভাবে এটি উভয় সংস্করণে চালানো উচিত।
পাইপফিশ

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

2
আমি বুঝতে পারি যে datetimeমন্তব্যটি এই উত্তরের মূল জোর নয়, তবে ভবিষ্যতের পাঠকদের জন্য, আমি উল্লেখ করতে চাই যে পাইথন 3 এর "স্থির" সংস্করণগুলিতে এখনও encoding='latin-1'পাইথন 2 তারিখের সময়গুলি অনুলিপি করতে হবে। যদি আপনার পিকলড পাইথন 2 ডেটাতে ল্যাটিন -1 ব্যতীত অন্য কোনও কিছুতে এনকোড করা ডেটটাইম এবং বাইটস্ট্রিং উভয়ই অন্তর্ভুক্ত হয়ে থাকে তবে আপনি encoding='bytes'সর্বোপরি ব্যবহারের চেয়ে আরও ভাল হতে পারেন ।
জন ওয়াই

15

ব্যবহার encoding='latin1'কিছু বিষয় যখন আপনার বস্তুর এতে numpy অ্যারে রয়েছে কারণ।

ব্যবহার encoding='bytes'করা আরও ভাল হবে।

ব্যবহারের সম্পূর্ণ ব্যাখ্যার জন্য দয়া করে এই উত্তরটি দেখুনencoding='bytes'


কোন বিষয়? আমার কী সাবধানতা অবলম্বন করা উচিত? ব্যবহার bytesবাইট () মধ্যে তোলে স্ট্রিং, তাই আমি পছন্দ latin1যদি সম্ভব হয়, কিন্তু এটা আমার কাছে স্পষ্ট নয় কি সমস্যা।
গুলজার

2
@ শ্রীরাগ-আর: আপনি যে সমস্যার মুখোমুখি হয়েছিলেন তার উদাহরণ দিতে পারেন? আমার কাছে numpy.ndarrayপাইথন cPickle.dumps()২. in ব্যবহার করে একটি দ্বি-মাত্রিক (নম্পুটি 1.14) রয়েছে এবং pickle.loads(..., encoding='latin1')জরিমানা কাজ করে পাইথন 3 এ আনপিকলিং রয়েছে ।
djvg

@djvg যখন আমি চিত্রগুলির স্ট্রিং হিসাবে চিত্রগুলি বাছাই করতে এবং সেগুলি আঁকতে পেলাম তখন আমি সমস্যার মুখোমুখি হয়েছিলাম। কোডটি এখানে পাওয়া যাবে। gist.github.com/sreeragh-ar/70205db3a43badbfa69f758faa898be3
শ্রীরাগ এআর

@ গুলজার দয়া করে সমস্যার জন্য উপরের কথাটি দেখুন। ছবিগুলি আন-পিক্লিংয়ের পরে দূষিত হয়ে উঠছিল।
শ্রীরাগ এআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.