পাইথনে ফাইল থেকে অক্ষর পাঠ


102

একটি পাঠ্য ফাইলে একটি স্ট্রিং রয়েছে "আমি এটি পছন্দ করি না"।

যাইহোক, আমি যখন এটি স্ট্রিংয়ে পড়ি তখন এটি "I don don xe2 \ x80 \ x98t" হয়ে যায়। আমি বুঝতে পারি যে \ u2018 হ'ল "" "এর ইউনিকোড উপস্থাপনা। আমি ব্যবহার করি

f1 = open (file1, "r")
text = f1.read()

কমান্ড পড়ার জন্য।

এখন, স্ট্রিংটি এমনভাবে পড়া সম্ভব যে এটি স্ট্রিংয়ের মধ্যে পড়লে এটি "আমার পছন্দ হয় না", "আমি don xe2 \ x80 \ x98t এর মতো পছন্দ করি না"?

দ্বিতীয় সম্পাদনা: আমি কিছু লোক এই সমস্যা সমাধানের জন্য ম্যাপিং ব্যবহার করতে দেখেছি, তবে সত্যিই কি এমন কোনও অন্তর্নির্মিত রূপান্তর নেই যা এই জাতীয় এএনএসআইকে ইউনিকোড (এবং তদ্বিপরীত) রূপান্তর করতে পারে?


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

নেই, কারণ ইউনিকোড কোড পয়েন্টে কয়েক হাজার রয়েছে। কোনটি ASCII অক্ষরের সাথে ম্যাপ করা উচিত তা আপনি কীভাবে সিদ্ধান্ত নেবেন?
জন মিলিকিন

2
বিটিডব্লিউ, আপনার পাঠ্য ফাইলটি ভেঙে গেছে! ইউ + 2018 হ'ল "বাম একক কোটেশন মার্ক", কোনও অ্যাডোস্ট্রোফ নয় (U + 0027 সর্বাধিক সাধারণ)।

জন, আপনার মন্তব্য ভুল, কমপক্ষে সাধারণ অর্থে। আইকনভিভি লাইব ইউনিকোড অক্ষরকে এসকিআই-তে স্থানান্তরিত করতে ব্যবহার করা যেতে পারে (এমনকি স্থানীয়ভাবে নির্ভর করে $ y পাইথন -c 'মুদ্রণ ইউ "\ u2018"। এনকোড ("utf-8")' | আইকনভ -t 'ascii // ট্রান্সলিট' | xxd 0000000: 270a

বিষয়টি হল, আপনাকে ইউনিকোডিকে এএসসিআইআইতে রূপান্তর করতে হবে (অন্যভাবে নয়)।
হাসেন

উত্তর:


157

তথ্যসূত্র: http://docs.python.org/howto/unicode

একটি ফাইল থেকে ইউনিকোড পড়া তাই সহজ:

import codecs
with codecs.open('unicode.rst', encoding='utf-8') as f:
    for line in f:
        print repr(line)

উভয় পাঠ্য এবং লেখার অনুমতি দিয়ে আপডেট মোডে ফাইলগুলি খোলানোও সম্ভব:

with codecs.open('test', encoding='utf-8', mode='w+') as f:
    f.write(u'\u4500 blah blah blah\n')
    f.seek(0)
    print repr(f.readline()[:1])

সম্পাদনা : আমি ধরে নিচ্ছি যে আপনার উদ্দেশ্যে করা লক্ষ্যটি পাইথনের একটি স্ট্রিংয়ের মধ্যে ফাইলটি সঠিকভাবে পড়তে সক্ষম। আপনি যদি ইউনিকোড থেকে কোনও এএসসিআইআই স্ট্রিংয়ে রূপান্তর করার চেষ্টা করছেন, তবে এটি করার সরাসরি কোনও উপায় নেই, যেহেতু ইউনিকোড অক্ষরগুলি অ্যাসেসিআইতে অগত্যা উপস্থিত থাকবে না।

আপনি যদি একটি এএসসিআইআই স্ট্রিংয়ে রূপান্তর করতে চাইছেন তবে নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করে দেখুন:

  1. নির্দিষ্ট ইউনিকোড অক্ষরকে ASCII সমতুল্য সঙ্গে প্রতিস্থাপন করুন, আপনি যদি কেবল কয়েকটি বিশেষ কেস যেমন এই নির্দিষ্ট উদাহরণ হিসাবে পরিচালনা করছেন তবে

  2. পরবর্তী নিকটতম ASCII সমতুল্য (রেফ https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting- এ রূপান্তর করতে unicodedataমডিউল normalize()এবং string.encode()পদ্ধতিটি ব্যবহার করুন ইউনিকোড থেকে অ্যাস্কি-ব্যবহার-অজগর ):

    >>> teststr
    u'I don\xe2\x80\x98t like this'
    >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore')
    'I donat like this'

3
codecsমডিউল সর্বজনীন নিউলাইনস মোডটি সঠিকভাবে পরিচালনা করে না। io.open()পরিবর্তে পাইথন ২.7++ ব্যবহার করুন (এটি open()পাইথন 3 এ অন্তর্নির্মিত )।
jfs

15

কিছু বিষয় বিবেচনা করার আছে।

একটি \ u2018 অক্ষরটি পাইথনের কোনও ইউনিকোড স্ট্রিংয়ের উপস্থাপনের খণ্ড হিসাবে উপস্থিত হতে পারে, যেমন আপনি যদি লিখেন:

>>> text = u'‘'
>>> print repr(text)
u'\u2018'

এখন আপনি যদি সহজভাবে ইউনিকোড স্ট্রিংটি প্রিন্ট করতে চান তবে কেবল ইউনিকোডের encodeপদ্ধতিটি ব্যবহার করুন :

>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I dont like this

যে কোনও ফাইল থেকে প্রতিটি লাইন ইউনিকোড হিসাবে পড়বে তা নিশ্চিত করার জন্য, আপনি ন্যায়বিচারের codecs.openপরিবর্তে ফাংশনটি আরও ভালভাবে ব্যবহার openকরতে পারবেন যা আপনাকে ফাইলের এনকোডিং নির্দিষ্ট করতে দেয়:

>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I dont like this

6

তবে এটি সত্যই "আমি এটি পছন্দ করি না" এবং "আমার এই পছন্দ হয় না"। U '\ u2018' অক্ষরটি "" "এর তুলনায় সম্পূর্ণ আলাদা একটি চরিত্র (এবং, দৃশ্যত, '`' এর সাথে আরও মিল রাখতে হবে)।

আপনি যদি এনকোডযুক্ত ইউনিকোডকে সরল ASCII তে রূপান্তর করার চেষ্টা করছেন, আপনি সম্ভবত ইউনিকোড বিরামচিহ্নের একটি ম্যাপিং রাখতে পারেন যা আপনি ASCII তে অনুবাদ করতে চান।

punctuation = {
  u'\u2018': "'",
  u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
  text = text.replace(src, dest)

ইউনিকোডে বিরামচিহ্নগুলির বিস্তর অক্ষর রয়েছে তবে আমি মনে করি আপনি যে কয়েকটি অ্যাপ্লিকেশনটি পড়ছেন তা যে কোনও অ্যাপ্লিকেশনই ব্যবহার করছে যা আপনি ব্যবহার করছেন কেবল তার মধ্যে কয়েকটিকে আপনি গণনা করতে পারেন।


1
প্রকৃতপক্ষে, আপনি যদি ইউনিকোড অধ্যাদেশগুলিতে ডিক মানচিত্রটি ইউনিকোড অর্ডিনালগুলি তৈরি করেন ({0x2018: 0x27, 0x2019: 0x27}) আপনি কেবল একবারে সমস্ত প্রতিস্থাপনটি সম্পাদন করতে টেক্সট.ট্রান্সলেট () এ পুরো ডিকটি পাস করতে পারেন।
থমাস ওয়াউটারস

5

পাইথন 3 পড়ার পদ্ধতি ব্যবহার করে এনকোডযুক্ত পাঠ্য ফাইলটি পড়াও সম্ভব:

f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()

এই প্রকরণের সাথে, কোনও অতিরিক্ত গ্রন্থাগার আমদানি করার দরকার নেই


3

আপনার পাঠ্য ফাইলটি নষ্ট হয়ে গেছে এ বিষয়টি বাদ দিয়ে (ইউ + 2018 একটি বাম কোটেশন চিহ্ন, অ্যাডোস্ট্রোফ নয়): আইকনভি ইউনিকোড অক্ষরকে এসকিআইতে ট্রান্সপ্লিট করার জন্য ব্যবহার করা যেতে পারে।

আপনাকে "আইকনভোডেডেক" এর জন্য গুগল করতে হবে, যেহেতু মডিউলটি আর সমর্থিত হবে না এবং এটির জন্য আমি কোনও হোমনিজ পৃষ্ঠা খুঁজে পাচ্ছি না।

>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"

বিকল্পভাবে আপনি iconvআপনার ফাইল পরিষ্কার করতে কমান্ড লাইন ইউটিলিটি ব্যবহার করতে পারেন :

$ xxd foo
0000000: e280 980a                                ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a                                     '.

2

এমন কোনও সম্ভাবনা রয়েছে যে কোনওভাবে আপনার ইউনিকোড পালানোর অক্ষর সহ একটি অ-ইউনিকোড স্ট্রিং রয়েছে, যেমন:

>>> print repr(text)
'I don\\u2018t like this'

আসলে আমার সাথে এর আগে একবার হয়েছিল। আপনি unicode_escapeইউনিকোডে স্ট্রিংটি ডিকোড করতে একটি কোডেক ব্যবহার করতে পারেন এবং তারপরে যেকোন বিন্যাসে এটি এনকোড করতে পারেন:

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I dont like this

1

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

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I dont like this

1

আসলে, ইউ + 2018 হল বিশেষ চরিত্রটির ইউনিকোড উপস্থাপনা। আপনি যদি চান, আপনি এই কোডের সাহায্যে অক্ষরটির উদাহরণগুলি ইউ + 0027 এ রূপান্তর করতে পারেন:

text = text.replace (u"\u2018", "'")

এছাড়াও, আপনি ফাইলটি লেখার জন্য কী ব্যবহার করছেন? f1.read()এর মতো দেখতে পাওয়া একটি স্ট্রিং ফিরে আসা উচিত:

'I don\xe2\x80\x98t like this'

যদি এটি এই স্ট্রিংটি ফিরিয়ে দেয় তবে ফাইলটি ভুলভাবে লেখা হচ্ছে:

'I don\u2018t like this'

দুঃখিত! যেমনটি আপনি বলেছেন, এটি 'আমি \ xe2 \ x80 \ x98t এর মতো ফিরে আসছি'
গ্র্যাভিটন

আপনি যে 'আমি don xe2 \ x80 \ x98t দেখতে পাচ্ছি না' তা পাইথন একটি স্ট্রিকে ডাকে। এটি ইউটিউন ডোন \ u2018 এর মতো ইউটিএফ -8 এনকোডিং হিসাবে দেখা যাচ্ছে, যা পাইথনের এক ইউনিকোড উদাহরণ। পূর্ববর্তী বা .encode ('utf-8') এ .decode ('utf-8') কল করার চেষ্টা করুন।
লোগান

@ ওপ: ওফস, ভুলে যাওয়া অর্ড () হেক্সের পরিবর্তে দশমিক ফেরত দেয়। ধরার জন্য আপনাকে ধন্যবাদ।
জন মিলিকিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.