পাইথনে একটি পাঠ্য ফাইল খোলার দুটি উপায় রয়েছে:
f = open(filename)
এবং
import codecs
f = codecs.open(filename, encoding="utf-8")
কখন codecs.open
বাঞ্ছনীয় open
?
পাইথনে একটি পাঠ্য ফাইল খোলার দুটি উপায় রয়েছে:
f = open(filename)
এবং
import codecs
f = codecs.open(filename, encoding="utf-8")
কখন codecs.open
বাঞ্ছনীয় open
?
codecs.open()
অপ্রচলিত আছে? পাইথন 3 ডক্সে আমি এটি মনে করি না: docs.python.org/3.7/library/codecs.html
উত্তর:
পাইথন ২.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()
সুস্পষ্ট এনকোডিং ব্যতীত কেবল বাইনারি ফাইলগুলি পড়তে কার্যকর ।
io.open()
পাঠ্যের জন্য এবং open()
কেবল বাইনারি হিসাবে ব্যবহার করুন। জড়িত বিষয়টি codecs.open()
মোটেই পছন্দ করা হয় না।
open
এবং codecs.open
, এবং বিশেষভাবে যখন আধুনিক সাবেক বাঞ্ছনীয়। একটি উত্তর যা উল্লেখের মতো এত বেশি codecs.open
নয় সে প্রশ্নের উত্তর দিতে পারে না।
codecs.open()
ব্যবহারের জন্য সঠিক ছিল এমন অনুমানের সাথে ) তবে কখন এটি ব্যবহার করবেন সে সম্পর্কে কোনও "সঠিক" উত্তর নেই। উত্তর io.open()
পরিবর্তে ব্যবহার করা হয়। এটি যদি আমি জিজ্ঞাসা করি "কখন প্রাচীরের মধ্যে পেরেক চালানোর জন্য আমি কোনও রেঞ্চ ব্যবহার করব?" সঠিক উত্তরটি "হাতুড়ি ব্যবহার করুন"।
ব্যক্তিগতভাবে, আমি সবসময় ব্যবহার করি codecs.open
যতক্ষণ না open
** ব্যবহারের একটি পরিষ্কার সনাক্তকরণের প্রয়োজন হয় । কারণটি হ'ল অনেকবার এমন হয়েছে যখন আমি আমার প্রোগ্রামগুলিতে utf-8 ইনপুট স্নিগ্ধ করে কামড়েছি। "ওহ, আমি কেবল জানি এটি সর্বদা অ্যাসিই থাকবে" এমন একটি ধারণা যা প্রায়শই ভেঙে যায়।
ডিফল্ট এনকোডিং হিসাবে 'utf-8' ধরে নেওয়া আমার অভিজ্ঞতাকে একটি নিরাপদ ডিফল্ট পছন্দ বলে মনে হচ্ছে, যেহেতু ASCII কে ইউটিএফ -8 হিসাবে বিবেচনা করা যেতে পারে, তবে রূপান্তরটি সত্য নয়। এবং সেই ক্ষেত্রে যখন আমি সত্যই জানি যে ইনপুটটি ASCII, তখন আমি এখনও দৃ still codecs.open
় বিশ্বাসী হিসাবে "সুস্পষ্টর চেয়ে ভাল ভাল" ।
** - পাইথন ২.x-তে, প্রশ্নের উত্তর হিসাবে পাইথন ৩-তে open
প্রতিস্থাপন করা হয়েছেcodecs.open
open
কখনও কখনও ইউটিএফ -8
io.open
পাইথন
io.open
গ্রহণ করে encoding
এবং newline
পরামিতিগুলি সেগুলি ব্যাখ্যা করে। এর বিপরীতে codecs.open
, ফাইলটি খোলার সাথে পাইথন ২.7 এমনকি io.open
উত্থাপিত হবে TypeError: write() argument 1 must be unicode, not str
যদি আপনি এটিতে str
( bytes
) লেখার চেষ্টা করেন । এর সাথে খোলা একটি ফাইল codecs.open
পরিবর্তে এতে অন্তর্নিহিত রূপান্তর চেষ্টা করবে unicode
, প্রায়শই বিভ্রান্তির দিকে ঝরে যায় UnicodeDecodeError
।
পাইথন 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
ফলে আপনি খুব সহজেই দ্বিতীয়টি করতে পারবেন।
কেবল সতর্কতা অবলম্বন করুন যে আপনি এটিকে ইউনিকোড স্ট্রিং দিচ্ছেন এবং বাই-স্ট্রিংগুলি নয় যা অ-এএসসিআইআই অক্ষর থাকতে পারে।
u''
প্রথম উদাহরণে এর ব্যবহারটি নোট করুন । এর অর্থ আমি একটি ইউনিকোড স্ট্রিং তৈরি করেছি, বাইটস্ট্রিং নয়। এই দুটি উদাহরণের মধ্যে পার্থক্য। দ্বিতীয় উদাহরণে আমি একটি বাইস্টেরিং তৈরি করছি এবং একটি ফাইলে তাদের মধ্যে একটি লেখার জন্য ঠিক আছে। আপনি যদি ASCII এর বাইরের অক্ষর ব্যবহার করেন তবে একটি ইউনিকোড স্ট্রিং ভাল না।
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
সবসময় বাইনারি মোডে ফাইল সঙ্গে কাজ করে।
আপনি যখন বাইনারি ফাইল লোড করতে চান তখন ব্যবহার করুন
f = io.open(filename, 'b')
।
একটি পাঠ্য ফাইল খোলার জন্য, সর্বদা f = io.open(filename, encoding='utf-8')
সুস্পষ্ট এনকোডিং সহ ব্যবহার করুন।
ইন পাইথন 3 কিন্তু open
একই জিনিস করে io.open
এবং এর পরিবর্তে ব্যবহার করা যাবে।
দ্রষ্টব্য: পাইথন ২.6- এ এটি পরিচয় হওয়ার পরে অবচিত ও প্রতিস্থাপনের
codecs.open
পরিকল্পনা করা হয়েছে । আমি কেবল তখনই এটি ব্যবহার করতাম যদি কোডটি পূর্ববর্তী অজগর সংস্করণের সাথে সামঞ্জস্য করা প্রয়োজন। পাইথনে কোডিক এবং ইউনিকোড সম্পর্কিত আরও তথ্যের জন্য ইউনিকোড হাটোটি দেখুন ।io.open
io.open
বা codecs.open
? ২. codecs.open
এখনও অবহেলিত নয়, আপনি যে পৃষ্ঠাটিতে লিঙ্ক করেছেন তার উপর আলোচনাটি পড়ুন।
আপনি যখন পাঠ্য ফাইলগুলির সাথে কাজ করছেন এবং ইউনিকোড অবজেক্টগুলিতে স্বচ্ছ এনকোডিং এবং ডিকোডিং চান।
আমি .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:
অনেক ঝামেলা ছাড়াই আমি পুরো ফাইলটি পড়তে সক্ষম, কোনও পরামর্শ?
codecs.open()
3.x এ অপ্রচলিত, যেহেতুopen()
একটিencoding
যুক্তি অর্জন করে।