TypeError: Python3 এ একটি ফাইলে লেখার সময় একটি বাইট-মত বস্তু প্রয়োজন, না 'str'




string python-3.x (6)

আমি খুব সম্প্রতি পাই 3.5 স্থানান্তরিত করেছি। এই কোড Python 2.7:

with open(fname, 'rb') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    tmp = line.strip().lower()
    if 'some-pattern' in tmp: continue
    # ... code

3.5 এ আপগ্রেড করার পর, আমি পেয়েছি:

TypeError: a bytes-like object is required, not 'str'

শেষ লাইন (প্যাটার্ন অনুসন্ধান কোড) ত্রুটি।

আমি বিবৃতির উভয় পাশে .decode() ফাংশনটি ব্যবহার করার চেষ্টা করেছি, এছাড়াও চেষ্টা .decode() :

if tmp.find('some-pattern') != -1: continue

- কোন লাভ নেই।

আমি প্রায় সব 2: 3 টি বিষয় দ্রুত সমাধান করতে সক্ষম হয়েছিলাম, কিন্তু এই ছোট্ট বিবৃতিটি আমাকে বিরক্ত করছে।


আপনি বাইনারি মোডে ফাইলটি খুলেছেন:

নিচের কোডটি টাইপ ইরেকরকে নিক্ষেপ করবে: একটি বাইট-মত বস্তু প্রয়োজন, 'str' নয়।

for line in lines:
    print(type(line))# <class 'bytes'>
    if 'substring' in line:
       print('success')

নিম্নলিখিত কোড কাজ করবে - আপনি ডিকোড () ফাংশন ব্যবহার করতে হবে:

for line in lines:
    line = line.decode()
    print(type(line))# <class 'str'>
    if 'substring' in line:
       print('success')

আপনি .encode() ব্যবহার করে আপনার স্ট্রিং এনকোড করতে পারেন

উদাহরণ:

'Hello World'.encode()

আপনি বাইনারি মোডে ফাইলটি খুলেছেন:

with open(fname, 'rb') as f:

এর মানে ফাইল থেকে পড়া সমস্ত তথ্য bytes বস্তু হিসাবে ফেরত দেওয়া হয়, str নয়। আপনি একটি কনটেনমেন্ট পরীক্ষা একটি স্ট্রিং ব্যবহার করতে পারবেন না:

if 'some-pattern' in tmp: continue

পরিবর্তে tmp বিরুদ্ধে পরীক্ষা করার জন্য আপনাকে একটি bytes বস্তু ব্যবহার করতে হবে:

if b'some-pattern' in tmp: continue

অথবা 'rb' মোড পরিবর্তে 'r' প্রতিস্থাপন করে পরিবর্তে ফাইলটিকে টেক্সটফাইল হিসাবে খুলুন।


আপনি wb থেকে w এ পরিবর্তন করতে হবে:

def __init__(self):
    self.myCsv = csv.writer(open('Item.csv', 'wb')) 
    self.myCsv.writerow(['title', 'link'])

থেকে

def __init__(self):
    self.myCsv = csv.writer(open('Item.csv', 'w'))
    self.myCsv.writerow(['title', 'link'])

এই পরিবর্তন করার পরে, ত্রুটি অদৃশ্য হয়ে যায়, তবে আপনি ফাইলটিতে লিখতে পারবেন না (আমার ক্ষেত্রে)। তাই সব পরে, আমার কোন উত্তর নেই?

উত্স: এম

'আরবি' এ পরিবর্তন আমাকে অন্য ত্রুটি এনেছে: io.support সমর্থিত: লিখুন


এটি ইতিমধ্যে উল্লেখ করা হয়েছে, আপনি বাইনারি মোডে ফাইল পড়া এবং তারপর বাইট একটি তালিকা তৈরি হয়। লুপের জন্য আপনার অনুসরণে আপনি স্ট্রিংগুলি বাইটের সাথে তুলনা করছেন এবং কোডটি ব্যর্থ হচ্ছে।

তালিকা যোগ করার সময় বাইট decoding কাজ করা উচিত। পরিবর্তিত কোডটি নিম্নরূপ দেখতে হবে:

with open(fname, 'rb') as f:
    lines = [x.decode('utf8').strip() for x in f.readlines()]

পাইথন 3 এ বাইট টাইপটি চালু করা হয়েছিল এবং এজন্য আপনার কোড পাইথন 2 এ কাজ করেছিল। পাইথন 2 এ বাইটগুলির জন্য কোন ডেটা টাইপ ছিল না:

>>> s=bytes('hello')
>>> type(s)
<type 'str'>

এই ছোট উদাহরণ জন্য: আমদানি সকেট

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(**b**'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print (data);

mysock.close()

"B" এর আগে যোগ করা হচ্ছে ' http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ nGet আমার সমস্যা সমাধান করুন'