পাইথনের ওপেন এবং কোডেস.ওপেনের মধ্যে পার্থক্য


98

পাইথনে একটি পাঠ্য ফাইল খোলার দুটি উপায় রয়েছে:

f = open(filename)

এবং

import codecs
f = codecs.open(filename, encoding="utf-8")

কখন codecs.openবাঞ্ছনীয় open?


46
দ্রষ্টব্য যে codecs.open()3.x এ অপ্রচলিত, যেহেতু open()একটি encodingযুক্তি অর্জন করে।
ইগনাসিও ওয়াজকেজ-আব্রামগুলি

তৃতীয় উপায়ও রয়েছে (পাইথন 2.x এ কমপক্ষে): `f = ফাইল (ফাইলের নাম) '
অ্যাডাম পার্কিন

4
@ IgnacioVazquez-Abram কি এমন কোনও লিঙ্ক codecs.open()অপ্রচলিত আছে? পাইথন 3 ডক্সে আমি এটি মনে করি না: docs.python.org/3.7/library/codecs.html
Varela

4
@varela: পাইথন ডকুমেন্টেশন পৃষ্ঠাটি আপনি উল্লেখ করেছেন: "বিল্টিন ওপেন () এবং সম্পর্কিত আইও মডিউল হ'ল এনকোডযুক্ত পাঠ্য ফাইলগুলির সাথে কাজ করার জন্য প্রস্তাবিত পন্থা"
লুসিয়ানো রামালহো

উত্তর:


83

পাইথন ২.6 থেকে, একটি ভাল অনুশীলনটি ব্যবহার করা হয় io.open()যা encodingএখনকার মতো অপ্রচলিতদের মতো একটি যুক্তিও গ্রহণ করে codecs.open()। পাইথন 3 -এ io.open, open()অন্তর্নির্মিতগুলির জন্য একটি নাম alias তাই io.open()পাইথন ২.6 এবং পাইথন ৩.৪ সহ পরবর্তী সংস্করণগুলিতে কাজ করে। দস্তাবেজগুলি দেখুন: http://docs.python.org/3.4/library/io.html

এখন, মূল প্রশ্নের জন্য: পাইথন 2-এ পাঠ্য ("প্লেইন পাঠ্য", এইচটিএমএল, এক্সএমএল এবং জেএসওন সহ) পড়ার সময় আপনাকে সর্বদাio.open() স্পষ্ট এনকোডিং বা open()পাইথন 3. এ স্পষ্টভাবে এনকোডিং সহ ব্যবহার করা উচিত so তাই করার অর্থ আপনি সঠিকভাবে পেয়েছেন ইউনিকোড ডিকোড করুন, বা ব্যাট থেকে ঠিক ত্রুটি পান, এটি ডিবাগ করা আরও সহজ করে তোলে।

খাঁটি এএসসিআইআই "সরল পাঠ" সুদূর অতীতের একটি রূপকথা my সঠিক ইংরেজী পাঠ্যে কোঁকড়ানো উদ্ধৃতি, এম-ড্যাশ, বুলেট, € (ইউরো লক্ষণ) এমনকি ডায়ারেসিস (¨) ব্যবহার করা হয়। নির্বোধ হতে হবে না! (এবং আসুন আমরা ফ্যাডে ডিজাইনের প্যাটার্নটি ভুলে যাই না!)

খাঁটি ASCII একটি আসল বিকল্প নয়, open()সুস্পষ্ট এনকোডিং ব্যতীত কেবল বাইনারি ফাইলগুলি পড়তে কার্যকর ।


4
@ForeverWintr উত্তরটি এখানে বেশ পরিষ্কারভাবে পাওয়া গেছে: io.open()পাঠ্যের জন্য এবং open()কেবল বাইনারি হিসাবে ব্যবহার করুন। জড়িত বিষয়টি codecs.open()মোটেই পছন্দ করা হয় না।
বিডোসারর

4
@ বিডেসরর, সেখানে একটি উত্তর রয়েছে, স্পষ্টভাবে, তবে এটি যে প্রশ্ন করা হয়েছিল তার কোনও উত্তর নয়। প্রশ্ন মধ্যে পার্থক্য সম্পর্কে ছিল openএবং codecs.open, এবং বিশেষভাবে যখন আধুনিক সাবেক বাঞ্ছনীয়। একটি উত্তর যা উল্লেখের মতো এত বেশি codecs.openনয় সে প্রশ্নের উত্তর দিতে পারে না।
ForeverWintr

4
@ ফোরওয়ারওয়ান্টার যদি ওপি ভুল প্রশ্ন জিজ্ঞাসা করে (যেমন codecs.open()ব্যবহারের জন্য সঠিক ছিল এমন অনুমানের সাথে ) তবে কখন এটি ব্যবহার করবেন সে সম্পর্কে কোনও "সঠিক" উত্তর নেই। উত্তর io.open()পরিবর্তে ব্যবহার করা হয়। এটি যদি আমি জিজ্ঞাসা করি "কখন প্রাচীরের মধ্যে পেরেক চালানোর জন্য আমি কোনও রেঞ্চ ব্যবহার করব?" সঠিক উত্তরটি "হাতুড়ি ব্যবহার করুন"।
বিডোসারর

20

ব্যক্তিগতভাবে, আমি সবসময় ব্যবহার করি codecs.openযতক্ষণ না open** ব্যবহারের একটি পরিষ্কার সনাক্তকরণের প্রয়োজন হয় । কারণটি হ'ল অনেকবার এমন হয়েছে যখন আমি আমার প্রোগ্রামগুলিতে utf-8 ইনপুট স্নিগ্ধ করে কামড়েছি। "ওহ, আমি কেবল জানি এটি সর্বদা অ্যাসিই থাকবে" এমন একটি ধারণা যা প্রায়শই ভেঙে যায়।

ডিফল্ট এনকোডিং হিসাবে 'utf-8' ধরে নেওয়া আমার অভিজ্ঞতাকে একটি নিরাপদ ডিফল্ট পছন্দ বলে মনে হচ্ছে, যেহেতু ASCII কে ইউটিএফ -8 হিসাবে বিবেচনা করা যেতে পারে, তবে রূপান্তরটি সত্য নয়। এবং সেই ক্ষেত্রে যখন আমি সত্যই জানি যে ইনপুটটি ASCII, তখন আমি এখনও দৃ still codecs.open় বিশ্বাসী হিসাবে "সুস্পষ্টর চেয়ে ভাল ভাল"

** - পাইথন ২.x-তে, প্রশ্নের উত্তর হিসাবে পাইথন ৩-তে openপ্রতিস্থাপন করা হয়েছেcodecs.open


আমি সত্যিই যা পাই না তা কেন openকখনও কখনও ইউটিএফ -8
এনকোডযুক্ত

এটি আমার কাছে বোধগম্য হয়। io.openপাইথন
২.7.৫

4
@ অ্যাডটেক, আপনি ঠিক বলেছেন যে এটি অনিবন্ধিত; তবে (কমপক্ষে 2.7.12 এ) পাইথন 3 যেমনটি io.openগ্রহণ করে encodingএবং newlineপরামিতিগুলি সেগুলি ব্যাখ্যা করে। এর বিপরীতে codecs.open, ফাইলটি খোলার সাথে পাইথন ২.7 এমনকি io.openউত্থাপিত হবে TypeError: write() argument 1 must be unicode, not strযদি আপনি এটিতে str( bytes) লেখার চেষ্টা করেন । এর সাথে খোলা একটি ফাইল codecs.openপরিবর্তে এতে অন্তর্নিহিত রূপান্তর চেষ্টা করবে unicode, প্রায়শই বিভ্রান্তির দিকে ঝরে যায় UnicodeDecodeError
jochietoch

9

পাইথন 2 এ ইউনিকোড স্ট্রিং এবং বাইটস্ট্রিংস রয়েছে। আপনি যদি কেবল বাইটস্ট্রিং ব্যবহার করেন তবে আপনি খালি ফাইলটি খোলার ফাইলটি পড়তে / লিখতে পারেন open()। সর্বোপরি, স্ট্রিংগুলি কেবল বাইটস।

যখন সমস্যাটি আসে তখন বলে, আপনার কাছে একটি ইউনিকোড স্ট্রিং রয়েছে এবং আপনি নিম্নলিখিতটি করেন:

>>> example = u'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

সুতরাং এখানে আপনি স্পষ্টতই আপনার ইউনিকোড স্ট্রিংটি utf-8 এ স্পষ্টভাবে এনকোড করেছেন বা codecs.openআপনি স্বচ্ছভাবে এটি করার জন্য ব্যবহার করেন।

আপনি যদি কেবল বাইটস্ট্রিং ব্যবহার করেন তবে কোনও সমস্যা নেই:

>>> example = 'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
>>>

এটি এর চেয়ে আরও বেশি জড়িত হয়ে যায় কারণ আপনি যখন +অপারেটরের সাথে কোনও ইউনিকোড এবং বাইস্টেরিং স্ট্রিংটি যুক্ত করেন আপনি একটি ইউনিকোড স্ট্রিং পান। যে এক দ্বারা কামড়ানো সহজ।

এছাড়াও codecs.openনন- ASCII অক্ষর দিয়ে bytestrings পাস হচ্ছে ভালো করে না:

codecs.open('test', 'w', encoding='utf-8').write('Μου αρέσει')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/codecs.py", line 691, in write
    return self.writer.write(data)
  File "/usr/lib/python2.7/codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)

ইনপুট / আউটপুট সংক্রান্ত স্ট্রিং সম্পর্কে পরামর্শটি সাধারণত "যত তাড়াতাড়ি সম্ভব ইউনিকোডে রূপান্তরিত হয় এবং যতদূর সম্ভব বাইটস্ট্রিংগুলিতে ফিরে আসে"। ব্যবহারের codecs.openফলে আপনি খুব সহজেই দ্বিতীয়টি করতে পারবেন।

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


আপনি আপনার দ্বিতীয় উদাহরণ ব্যাখ্যা করতে পারেন? এটি আপনার প্রথম উদাহরণের সাথে অভিন্ন বলে মনে হচ্ছে, সুতরাং ফলাফলটি কেন অন্যরকম হবে?
ক্রিস জনসন 21

u''প্রথম উদাহরণে এর ব্যবহারটি নোট করুন । এর অর্থ আমি একটি ইউনিকোড স্ট্রিং তৈরি করেছি, বাইটস্ট্রিং নয়। এই দুটি উদাহরণের মধ্যে পার্থক্য। দ্বিতীয় উদাহরণে আমি একটি বাইস্টেরিং তৈরি করছি এবং একটি ফাইলে তাদের মধ্যে একটি লেখার জন্য ঠিক আছে। আপনি যদি ASCII এর বাইরের অক্ষর ব্যবহার করেন তবে একটি ইউনিকোড স্ট্রিং ভাল না।
মান্দিবল 79৯

7

যখন আপনার একটি নির্দিষ্ট এনকোডিং রয়েছে এমন কোনও ফাইল খোলার দরকার হবে তখন আপনি codecsমডিউলটি ব্যবহার করবেন ।


15
আমি সব পাঠ্য ফাইল একটি নির্দিষ্ট এনকোডিং, একরকম (আছে:
cedbeu

5

codecs.open, আমি মনে করি, যে Python 2দিনগুলি অন্তর্নির্মিত খোলাতে খুব সহজ ইন্টারফেস এবং কম ক্ষমতা ছিল সেদিনের মধ্যে থেকে কেবল একটি অবশিষ্টাংশ । পাইথন 2-এ বিল্ট-ইন openকোনও এনকোডিং যুক্তি গ্রহণ করে না, সুতরাং আপনি যদি বাইনারি মোড বা ডিফল্ট এনকোডিং ব্যতীত অন্য কোনও কিছু ব্যবহার করতে চান তবে কোডেক.ওপেন ব্যবহার করার কথা ছিল।

ইন Python 2.6, আইও মডিউলটি কিছুটা সহজসাধ্য করার জন্য সহায়তা করেছিল। সরকারী ডকুমেন্টেশন অনুযায়ী

New in version 2.6.

The io module provides the Python interfaces to stream handling.
Under Python 2.x, this is proposed as an alternative to the
built-in file object, but in Python 3.x it is the default
interface to access files and streams.

এটি বলার পরে, আমি codecs.openবর্তমান দৃশ্যে কেবলমাত্র ব্যবহারটিই পিছনের সামঞ্জস্যের জন্য ভাবতে পারি । অন্যান্য সমস্ত পরিস্থিতিতে (যদি আপনি পাইথন <2.6 ব্যবহার না করেন) এটি ব্যবহার করা ভাল io.open। এছাড়াও Python 3.x io.openএকই হিসাবে হয়built-in open

বিঃদ্রঃ:

তার মাঝে একটি সিনট্যাক্স পার্থক্য নেই codecs.openএবং io.openপাশাপাশি।

codecs.open:

open(filename, mode='rb', encoding=None, errors='strict', buffering=1)

io.open:

open(file, mode='r', buffering=-1, encoding=None,
     errors=None, newline=None, closefd=True, opener=None)

সিনট্যাক্সের ক্ষেত্রে কেবল codecs.openএবং io.openপৃথক নয় , তারা বিভিন্ন ধরণের জিনিসগুলি ফেরত দেয়। এছাড়াও codecs.openসবসময় বাইনারি মোডে ফাইল সঙ্গে কাজ করে।
wombatonfire

4
  • আপনি যখন বাইনারি ফাইল লোড করতে চান তখন ব্যবহার করুন f = io.open(filename, 'b')

  • একটি পাঠ্য ফাইল খোলার জন্য, সর্বদা f = io.open(filename, encoding='utf-8')সুস্পষ্ট এনকোডিং সহ ব্যবহার করুন।

ইন পাইথন 3 কিন্তু openএকই জিনিস করে io.openএবং এর পরিবর্তে ব্যবহার করা যাবে।

দ্রষ্টব্য: পাইথন ২.6- এ এটি পরিচয় হওয়ার পরে অবচিত ও প্রতিস্থাপনের codecs.openপরিকল্পনা করা হয়েছে । আমি কেবল তখনই এটি ব্যবহার করতাম যদি কোডটি পূর্ববর্তী অজগর সংস্করণের সাথে সামঞ্জস্য করা প্রয়োজন। পাইথনে কোডিক এবং ইউনিকোড সম্পর্কিত আরও তথ্যের জন্য ইউনিকোড হাটোটি দেখুনio.open


1. কেন আমি সঙ্গে বাইনারি মোডে একটি ফাইল খুলতে পারবে না io.openবা codecs.open? ২. codecs.openএখনও অবহেলিত নয়, আপনি যে পৃষ্ঠাটিতে লিঙ্ক করেছেন তার উপর আলোচনাটি পড়ুন।
wombatonfire

ভাল দিক! ১. আপনি যে কোনওটি ব্যবহার করতে পারেন তবে আমি আবার কোডেকস.ওপেনের বিরুদ্ধে পরামর্শ দেব যদি না আপনি পাইথন ২.৫ বা তার বেশি বয়সের হন। ২. হ্রাস অবিলম্বে ঘটেছিল না, বরং ভবিষ্যতে এই প্রতিফলনটি প্রকাশ করার জন্য আমি আমার উত্তর আপডেট করেছি।
উইল্কে

3

আপনি যখন পাঠ্য ফাইলগুলির সাথে কাজ করছেন এবং ইউনিকোড অবজেক্টগুলিতে স্বচ্ছ এনকোডিং এবং ডিকোডিং চান।


0

আমি .asm ফাইলটি খুলতে এবং ফাইলটি প্রক্রিয়া করার মতো পরিস্থিতিতে ছিলাম।

#https://docs.python.org/3/library/codecs.html#codecs.ignore_errors
#https://docs.python.org/3/library/codecs.html#codecs.Codec.encode
with codecs.open(file, encoding='cp1252', errors ='replace') as file:

অনেক ঝামেলা ছাড়াই আমি পুরো ফাইলটি পড়তে সক্ষম, কোনও পরামর্শ?

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