আমি কীভাবে পাইথন 3 বাইট-স্ট্রিং ভেরিয়েবলকে নিয়মিত স্ট্রিংয়ে রূপান্তর করব?


116

আমি একটি এক্সএমএল ইমেল সংযুক্তিতে পড়েছি

bytes_string=part.get_payload(decode=False)

পেডলোডটি বাইট স্ট্রিং হিসাবে আসে, যেমন আমার পরিবর্তনশীল নামটি প্রস্তাব দেয়।

এই স্ট্রিংটিকে আমি ব্যবহারযোগ্য স্ট্রিংয়ে পরিণত করার জন্য প্রস্তাবিত পাইথন 3 পদ্ধতির ব্যবহার করার চেষ্টা করছি।

উদাহরণটি দেখায়:

str(b'abc','utf-8')

কীভাবে আমি bআমার পরিবর্তনশীলটিতে (বাইটস) কীওয়ার্ড যুক্তি প্রয়োগ করতে পারি bytes_stringএবং প্রস্তাবিত পদ্ধতির ব্যবহার করতে পারি ?

আমি যেভাবে চেষ্টা করেছি তা কার্যকর হয় না:

str(bbytes_string, 'utf-8')

উত্তর:


210

আপনার এটি শেষ লাইনে প্রায় ঠিক ছিল। তুমি চাও

str(bytes_string, 'utf-8')

কারণ ধরণ bytes_stringহয় bytes, ধরণ হিসাবে একই b'abc'


6
str(bytes_string, 'utf-8', 'ignore')তৃতীয় প্যারামিটারটি পাস করে ত্রুটিগুলি উপেক্ষা করা যেতে পারে।
শুভময়

2
দেখে মনে হচ্ছে এটি পাইং এর উত্তরের মন্তব্য হওয়া উচিত (যা অবৈধ ইনপুট পরিচালনা করে) addresses যদি (আপনি বিশ্বাস করেন) এর সাথে কোনও ভুল নেই bytes_stringতবে আপনি ত্রুটিগুলি উপেক্ষা করতে চান কেন?
টবি স্পিড

3
আমি তোমার পদ্ধতির ত্রুটি নিম্নলিখিত পাচ্ছি: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byteজন্য নিম্নলিখিত পংক্তি বাইট b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
Alper

ভাল @ আল্পার, এটি কোনও বৈধ ইউটিএফ -8 স্ট্রিং নয়, তাই আপনি কী আশা করেছিলেন?
টবি স্পিড

সমাধানের জন্য ধন্যবাদ
অজয় কুমার

49

পাঠ্যটি এনকোড decode()করে রাখার জন্য একটি bytesদৃষ্টিতে ফোন করুন ।

str = bytes.decode()

5
ইউনিকোড ডিকোড এরিয়ার: 'utf-8' কোডেক 230 পজিশনে 0xf6 বাইট ডিকোড করতে পারে না: অবৈধ শুরু বাইট
জুহা উন্টিনেন

3
@ জুহাউন্টিনেন আপনার এনকোডিং সম্ভবত utf-8 নয়।
tommy.carstensen

4
অ্যারে থেকে নন-ইউটিএফ 8 পালক কীভাবে ফিলিপ করবেন (এড়িয়ে যাবেন)?
ডাঃ ফেইলভ

9

আপডেট:

কোনও bএবং প্রথম এবং শেষে উদ্ধৃতি নেই

bytesএমনকি অদ্ভুত পরিস্থিতিতে এমনকি স্ট্রিংগুলিতে রূপান্তর কীভাবে ।

আপনার কোডটিতে'utf-8' এনকোডিংয়ের জন্য অবিশ্বাস্য অক্ষর থাকতে পারে , কোনও অতিরিক্ত পরামিতি ছাড়াই কেবল স্ট্র্যাং ব্যবহার করা ভাল:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

যদি আপনি 'utf-8'এই নির্দিষ্ট বাইটগুলিতে প্যারামিটার যোগ করেন তবে আপনার ত্রুটি পাওয়া উচিত।

পাইথন 3 স্ট্যান্ডার্ড যেমন বলেছে, textএখন কোনও উদ্বেগ ছাড়াই এখন utf-8 এ থাকবে।


ফলাফল "বি '\\ x02 - d xdfI #)'" যা সম্ভবত তিনি চান না
গ্লেন থম্পসন

@ গ্লেথহম্পসন এটি অযাচিত অবস্থার জন্য কেবল উদাহরণ, এটি ঘটতে পারে। আমি এই নির্দিষ্ট পাঠটি ইচ্ছাকৃতভাবে ব্যবহার করি। আপনি যদি বোঝাতে চান যে b
পাঠ্যটির

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

@ ডিগো ফার্নান্দো মরিলোভ্যালেনসি, আপনাকে স্বাগতম আমি সাহায্য করতে পারে খুশি।
সেফি

6

অ্যারে থেকে নন-ইউটিএফ 8 পালক কীভাবে ফিলিপ করবেন (এড়িয়ে যাবেন)?

@ Uname01 এর পোস্ট এবং ওপিতে এই মন্তব্যটি সম্বোধন করতে ত্রুটিগুলি উপেক্ষা করুন:

কোড

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

বিস্তারিত

দস্তাবেজগুলি থেকে , এখানে একই errorsপরামিতি ব্যবহার করে আরও উদাহরণ দেওয়া হয়েছে :

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

ত্রুটি যুক্তি প্রতিক্রিয়াটি নির্দিষ্ট করে যখন এনকোডিংয়ের নিয়ম অনুসারে ইনপুট স্ট্রিংটি রূপান্তর করা যায় না। এই যুক্তিটির জন্য আইনি মানগুলি 'strict'হ'ল (একটি UnicodeDecodeErrorব্যতিক্রম উত্থাপন ), 'replace'(ব্যবহার U+FFFD, REPLACEMENT CHARACTER), বা 'ignore'(কেবলমাত্র ইউনিকোড ফলাফলের বাইরে চরিত্রটি রেখে দেওয়া)।

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