পাইথন 3 ব্যাকপোর্টিং 3 উন্মুক্ত (এনকোডিং = "utf-8") পাইথন 2 এ


152

আমার কাছে পাইথন কোডবেস রয়েছে, পাইথন 3 এর জন্য নির্মিত, যা এনকোডিং প্যারামিটার সহ পাইথন 3 স্টাইল খোলা () ব্যবহার করে:

https://github.com/miohtama/vvv/blob/master/vvv/textlineplugin.py#L47

    with open(fname, "rt", encoding="utf-8") as f:

এখন আমি এই কোডটি পাইথন ২.x এ ব্যাকপোর্ট করতে চাই, যাতে আমার কাছে একটি কোডবেস থাকে যা পাইথন 2 এবং পাইথন 3 এর সাথে কাজ করে।

open()পার্থক্য এবং এনকোডিং প্যারামিটারের অভাব নিয়ে কাজ করার প্রস্তাবিত কৌশলটি কী ?

আমার কাছে কি পাইথন 3 open()স্টাইলের ফাইল হ্যান্ডলার থাকতে পারে যা বাইটস্ট্রিংগুলি প্রবাহিত করে, তাই এটি পাইথন 2 এর মতো কাজ করবে open()?

উত্তর:


176

1. পাইথন 2 এ একটি এনকোডিং প্যারামিটার পেতে:

আপনার যদি পাইথন ২.6 এবং ২.7 সমর্থন করতে চান তবে আপনি এর io.openপরিবর্তে ব্যবহার করতে পারেন openioপাইথন 3 এর জন্য নতুন আইও সাবসিস্টেম এবং এটি পাইথন ২,6 টি উত্তর ২.7-তেও রয়েছে। দয়া করে অবগত হন যে পাইথন ২.6 এ (পাশাপাশি 3.0.০) এটি পাইথনটি খাঁটিভাবে প্রয়োগ করা হয়েছে এবং খুব ধীর গতির, সুতরাং আপনার যদি ফাইলগুলি পড়ার গতির প্রয়োজন হয় তবে এটি কোনও ভাল বিকল্প নয়।

আপনার যদি গতির প্রয়োজন হয় এবং আপনার পাইথন ২.6 বা তার আগে সমর্থন করতে হয় তবে আপনি তার codecs.openপরিবর্তে ব্যবহার করতে পারেন । io.openএটিতে একটি এনকোডিং প্যারামিটারও রয়েছে এবং এটি লাইন-এন্ডিংগুলি ভিন্নভাবে পরিচালনা করে quite

২. পাইথন 3 open()স্টাইলের ফাইল হ্যান্ডলারটি পেতে যা বাইটস্ট্রিংগুলি প্রবাহিত করে:

open(filename, 'rb')

'বি' নোট করুন, যার অর্থ 'বাইনারি'।


11
'বি' এর অর্থ বাইনারি মোড, বাইট নয় means ডকস.পাইথন.আর . / 3 / লাইব্রেরি / ফাংশনস html# খোলা দেখুন ।
অপরাহ্নের

7
@ এমপিদারো এক্ষেত্রে একই জিনিস, তবে কঠোরভাবে বলছি, হ্যাঁ।
লেনার্ট রেজেব্রো

আমি এই সমস্যায় পড়েছি যে আপনি বিকল্প 2;) এর জন্য বাইট স্ট্রিমের উপর দিয়ে রেজেক্স চালাতে পারবেন না
জোনাথন কোমার

3
@ macmadness86 আপনার একটি বাইট রিজেক্সপ এক্সপ্রেশন ব্যবহার করতে হবে।
লেনার্ট রেজেব্রো

4
পোর্টিং হাটো থেকে একটি নোট: "কোডেক.ওপেন () ব্যবহারের পুরানো অনুশীলন নিয়ে বিরক্ত করবেন না কারণ এটি পাইথন 2.5 এর সাথে সামঞ্জস্য রাখার জন্য প্রয়োজনীয়।" docs.python.org/3/howto/pyporting.html
আল

65

আমি মনে করি

from io import open

করা উচিত.


7
আমি মনে করি নীচে লেনার্টের প্রতিক্রিয়া আরও ভাল কারণ এটি আরও ব্যাখ্যা প্রদান করে এবং আইও মডিউল সম্পর্কে ধীরে ধীরে 2.x কম হওয়ার সাথে সাথে কোডেস.ওপেন ব্যবহারের পরামর্শও দেয়।
জিপিএস

2
আমি from io import openপাইথন 3 এ ব্যবহার করলে কী হবে ? আমি বর্তমানে পারফর্মেন্সের জন্য যত্ন নিই না।
ম্যাথ

8
@ মাইথ আইটি থেকে পাইথন 3 ইনপুটটি অন্তর্নির্মিত খোলার জন্য একটি উপনাম। দেখুন docs.python.org/3/library/io.html?highlight=io#io.open
mfussenegger


8

এটি কৌশলটি করতে পারে:

import sys
if sys.version_info[0] > 2:
    # py3k
    pass
else:
    # py2
    import codecs
    import warnings
    def open(file, mode='r', buffering=-1, encoding=None,
             errors=None, newline=None, closefd=True, opener=None):
        if newline is not None:
            warnings.warn('newline is not supported in py2')
        if not closefd:
            warnings.warn('closefd is not supported in py2')
        if opener is not None:
            warnings.warn('opener is not supported in py2')
        return codecs.open(filename=file, mode=mode, encoding=encoding,
                    errors=errors, buffering=buffering)

তারপরে আপনি কোডটি পাইথন 3 উপায়ে রাখতে পারেন।

মনে রাখবেন, কিছু API গুলি পছন্দ newline, closefd, openerকাজ করে না


1
এটি এড়াতে আপনি শর্তটি বিপরীত করতে পারেন pass
bfontaine

2

আপনি যদি ব্যবহার করে থাকেন তবে আপনি এটি ব্যবহার sixকরতে পারেন, যার মাধ্যমে সর্বশেষ পাইথন 3 এপিআই ব্যবহার করে পাইথন 2/3 উভয় ক্ষেত্রে চালানো যেতে পারে:

import six

if six.PY2:
    # FileNotFoundError is only available since Python 3.3
    FileNotFoundError = IOError
    from io import open

fname = 'index.rst'
try:
    with open(fname, "rt", encoding="utf-8") as f:
        pass
        # do_something_with_f ...
except FileNotFoundError:
    print('Oops.')

এবং, পাইথন 2 সমর্থন পরিত্যাগ কেবলমাত্র সম্পর্কিত সমস্ত কিছু মুছে ফেলছে six

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