python - TypeError: পাইথন 3-এ কোনও ফাইল লেখার সময় বাইট-এর মতো অবজেক্টের প্রয়োজন হয় 'স্ট্রিং' নয়




string python-3.x (6)

আমি খুব সম্প্রতি পাই 3.5 তে মাইগ্রেশন করেছি। এই কোডটি পাইথন ২.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() ফাংশনটি ব্যবহার করে চেষ্টা করেছি:

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

- কোন লাভ হয়নি।

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


আপনাকে ডাব্লু ডাব্লু থেকে ডাব্লুতে পরিবর্তন করতে হবে:

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'])

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

উত্স: remove এম অপসারণ করার পদ্ধতি

'আরবি' তে পরিবর্তন করা আমার অন্যান্য ত্রুটি নিয়ে আসে: io.UnsupportedOperation: লিখুন


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

উদাহরণ:

'Hello World'.encode()

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

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

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

if 'some-pattern' in tmp: continue

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

if b'some-pattern' in tmp: continue

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


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

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()

'GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 before n before n' এর আগে "বি" যুক্ত করা আমার সমস্যার সমাধান করেছে


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

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

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

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

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

পাঠ্য হিসাবে আপনার ফাইল খোলার চেষ্টা করবেন না কেন?

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

অতিরিক্তভাবে এখানে সরকারী পৃষ্ঠায় অজগর 3.x এর লিঙ্ক রয়েছে: https://docs.python.org/3/library/io.html এবং এটি উন্মুক্ত ফাংশন: https://docs.python.org/3/library/functions.html#open

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





byte