পাইথন 3-এ স্ট্রিংআইও


473

আমি পাইথন ৩.২.১ ব্যবহার করছি এবং আমি StringIOমডিউলটি আমদানি করতে পারি না । আমি ব্যবহার io.StringIOএবং এটি কাজ করে, কিন্তু আমি সঙ্গে এটি ব্যবহার করতে পারবেন না numpy'এর genfromtxtভালো:

x="1 3\n 4.5 8"        
numpy.genfromtxt(io.StringIO(x))

আমি নিম্নলিখিত ত্রুটি পেয়েছি:

TypeError: Can't convert 'bytes' object to str implicitly  

এবং আমি যখন import StringIOএটি লিখতে বলে

ImportError: No module named 'StringIO'

উত্তর:


771

আমি যখন আমদানি স্ট্রিংআইও লিখি তখন এটি বলে যে এ জাতীয় কোনও মডিউল নেই।

পাইথন 3.0 এ নতুন কী থেকে :

StringIOএবং cStringIOমডিউল চলে গেছে। পরিবর্তে, আমদানি io মডিউল এবং ব্যবহার io.StringIOবা io.BytesIOযথাক্রমে টেক্সট এবং ডাটা জন্য।


পাইথন 3 (ক্যাভেট এমপোটার) এ কাজ করার জন্য কিছু পাইথন 2 কোড ঠিক করার একটি সম্ভবত কার্যকর পদ্ধতি:

try:
    from StringIO import StringIO ## for Python 2
except ImportError:
    from io import StringIO ## for Python 3

দ্রষ্টব্য: এই উদাহরণটি প্রশ্নের মূল ইস্যুটির জন্য স্পর্শকাতর হতে পারে এবং অনুপস্থিত StringIOমডিউলটিকে সাধারণভাবে সম্বোধন করার সময় বিবেচনা করার মতো কিছু হিসাবে অন্তর্ভুক্ত করা যেতে পারে । বার্তাটির আরও সরাসরি সমাধানের জন্য TypeError: Can't convert 'bytes' object to str implicitly, এই উত্তরটি দেখুন


13
এগুলি উল্লেখ করার মতো নয়, তাই আপনি TypeErrorযদি বিচ্ছিন্নভাবে এই পরিবর্তনটি করেন তবে আপনি s (স্ট্রিং আর্গুমেন্ট প্রত্যাশিত, 'বাইটস' পেয়েছেন) দিয়ে শেষ করতে পারেন । আপনাকে অজগর 3 তে সাবধানে btyes এবং str (ইউনিকোড) আলাদা করতে হবে
অ্যান্ডি হেডেন

7
আমার মতো নবীনদের জন্য: আইও আমদানি স্ট্রিংআইও এর অর্থ আপনি এটিকে স্ট্রিংআইও () হিসাবে আখ্যায়িত করেছেন, আইও স্ট্রিংআইও () নয়।
নুমেনন

11
কীভাবে পাইথন 2 এবং 3 এর সাথে সামঞ্জস্যপূর্ণ: ঠিকfrom io import StringIO
ওলেহ প্রাইপিন

8
অজগর 3 এ numpy.genfromtxt () এর জন্য এটি সহজ ভুল Please অনুগ্রহ করে রোমান শাপোলোভের উত্তরটি দেখুন।
বিল হুয়াং

2
@ নোবার: পরেরটি। মূল প্রশ্নটি পাইথন 3.x ব্যবহার করে, যেখান থেকে মডিউলটি StringIOচলে গেছে এবং from io import BytesIOপরিবর্তে প্রয়োগ করা উচিত। পাইথন ৩.৩ @ অ্যাক্রিপস পাইডেভ + উইন x এক্স 64৪৪ তে নিজেকে পরীক্ষিত করেছি। আমি যদি ভুল ছিলাম দয়া করে আমাকে জানান।
বিল হুয়াং



24

আপনার প্রশ্নের জন্য ওপি এবং আপনার উত্তরের জন্য রোমানকে ধন্যবাদ। এটি খুঁজতে আমাকে কিছুটা অনুসন্ধান করতে হয়েছিল; আমি আশা করি নিম্নলিখিতটি অন্যকে সহায়তা করে।

পাইথন 2.7

দেখুন: https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html

import numpy as np
from StringIO import StringIO

data = "1, abc , 2\n 3, xxx, 4"

print type(data)
"""
<type 'str'>
"""

print '\n', np.genfromtxt(StringIO(data), delimiter=",", dtype="|S3", autostrip=True)
"""
[['1' 'abc' '2']
 ['3' 'xxx' '4']]
"""

print '\n', type(data)
"""
<type 'str'>
"""

print '\n', np.genfromtxt(StringIO(data), delimiter=",", autostrip=True)
"""
[[  1.  nan   2.]
 [  3.  nan   4.]]
"""

পাইথন 3.5:

import numpy as np
from io import StringIO
import io

data = "1, abc , 2\n 3, xxx, 4"
#print(data)
"""
1, abc , 2
 3, xxx, 4
"""

#print(type(data))
"""
<class 'str'>
"""

#np.genfromtxt(StringIO(data), delimiter=",", autostrip=True)
# TypeError: Can't convert 'bytes' object to str implicitly

print('\n')
print(np.genfromtxt(io.BytesIO(data.encode()), delimiter=",", dtype="|S3", autostrip=True))
"""
[[b'1' b'abc' b'2']
 [b'3' b'xxx' b'4']]
"""

print('\n')
print(np.genfromtxt(io.BytesIO(data.encode()), delimiter=",", autostrip=True))
"""
[[  1.  nan   2.]
 [  3.  nan   4.]]
"""

একপাশে:

dtype = "| এসএক্স", যেখানে x = যেকোন, 1, 2, 3, ...}:

dtypes। পাইথনে এস 1 এবং এস 2 এর মধ্যে পার্থক্য

"| এস 1 এবং | এস 2 স্ট্রিং হ'ল ডেটা টাইপ বর্ণনাকারী; প্রথমটির অর্থ অ্যারে দৈর্ঘ্য 1, দ্বিতীয় দৈর্ঘ্যের 2 টি স্ট্রিং ধারণ করে ..."



17

রোমান শাপোলোভের কোডটি পাইথন ৩.x এর পাশাপাশি পাইথন ২.6 / ২.7 এ কাজ করা উচিত। এখানে এটি আবার সম্পূর্ণ উদাহরণ সহ:

import io
import numpy
x = "1 3\n 4.5 8"
numpy.genfromtxt(io.BytesIO(x.encode()))

আউটপুট:

array([[ 1. ,  3. ],
       [ 4.5,  8. ]])

পাইথন 3.x এর ব্যাখ্যা:

  • numpy.genfromtxt একটি বাইট স্ট্রিম গ্রহণ করে (ইউনিকোডের পরিবর্তে বাইট হিসাবে ব্যাখ্যা করা কোনও ফাইল-জাতীয় বস্তু)।
  • io.BytesIOএকটি বাইট স্ট্রিং নেয় এবং একটি বাইট স্ট্রিম প্রদান করে। io.StringIOঅন্যদিকে, ইউনিকোড স্ট্রিং নেবে এবং ইউনিকোড স্ট্রিমটি ফিরিয়ে আনবে।
  • x স্ট্রিংকে আক্ষরিক অর্পণ করা হয়, যা পাইথন ৩.x এ ইউনিকোড স্ট্রিং।
  • encode()ইউনিকোড স্ট্রিং নেয় xএবং এটি থেকে একটি বাইট স্ট্রিং তৈরি করে, এইভাবে io.BytesIOএকটি বৈধ যুক্তি দেয়।

পাইথন ২.6 / ২.7 এর একমাত্র পার্থক্য হ'ল এটি xএকটি বাইট স্ট্রিং (ধরে from __future__ import unicode_literalsনেওয়া ব্যবহার করা হয় না) এবং তারপরে encode()বাইট স্ট্রিংটি নেয় xএবং তারপরেও একই বাইট স্ট্রিংটি তৈরি করে। সুতরাং ফলাফল একই।


যেহেতু এটি এসও এর অন্যতম জনপ্রিয় প্রশ্ন StringIO, তাই আমদানি বিবরণী এবং বিভিন্ন পাইথন সংস্করণ সম্পর্কে আরও কিছু ব্যাখ্যা এখানে।

এখানে ক্লাসগুলি রয়েছে যা একটি স্ট্রিং নেয় এবং একটি স্ট্রিম ফিরিয়ে দেয়:

  • io.BytesIO(পাইথন 2.6, 2.7, এবং 3.x) - একটি বাইট স্ট্রিং নেয়। একটি বাইট স্ট্রিম ফিরিয়ে দেয়।
  • io.StringIO(পাইথন 2.6, 2.7, এবং 3.x) - একটি ইউনিকোড স্ট্রিং নেয় T একটি ইউনিকোড স্ট্রিম ফেরত দেয়।
  • StringIO.StringIO(পাইথন ২.x) - একটি বাইট স্ট্রিং বা ইউনিকোড স্ট্রিং নেয়। যদি বাইট স্ট্রিং হয়, একটি বাইট স্ট্রিম প্রদান করে। যদি ইউনিকোড স্ট্রিং হয় তবে একটি ইউনিকোড স্ট্রিম প্রদান করে।
  • cStringIO.StringIO(পাইথন ২.x) - এর দ্রুততম সংস্করণ StringIO.StringIO, তবে ইউনিকোড স্ট্রিং নিতে পারছে না যেখানে অ-এএসসিআইআই অক্ষর রয়েছে।

নোট যে StringIO.StringIOহিসাবে আমদানি করা হয় from StringIO import StringIO, তারপর হিসাবে ব্যবহার করা হয় StringIO(...)। হয় যে হয়, বা আপনি import StringIOএবং তারপর ব্যবহার StringIO.StringIO(...)। মডিউলটির নাম এবং শ্রেণীর নাম একই হতে পারে। এটি যেভাবে অনুরূপ datetime

আপনার সমর্থিত পাইথন সংস্করণগুলির উপর নির্ভর করে কী ব্যবহার করবেন:

  • আপনি শুধুমাত্র পাইথন 3.x সমর্থন করেন: শুধু ব্যবহার io.BytesIOবা io.StringIOনির্ভর ধরনের তথ্য আপনার সাথে কাজ করছি কি।

  • : আপনি উভয় পাইথন 2.6 / 2.7 এবং 3.x সমর্থন থাকে, বা 2.6 / 2.7 থেকে 3.x আপনার কোড রূপান্তর করার চেষ্টা করছেন সবচেয়ে সহজ পদ্ধিতি হল বিকল্প ব্যবহার করতে এখনও io.BytesIOবা io.StringIO। যদিও StringIO.StringIOনমনীয় এবং সুতরাং এটি 2.6 / 2.7 এর জন্য পছন্দসই বলে মনে হয়, তবে এই নমনীয়তাটি বাগগুলিকে মাস্ক করতে পারে যা 3.x তে প্রকাশিত হবে। উদাহরণস্বরূপ, আমার কাছে কিছু কোড ছিল যা পাইথন সংস্করণ ব্যবহার করে StringIO.StringIOবা তার io.StringIOউপর নির্ভর করে ছিল, তবে আমি আসলে একটি বাইট স্ট্রিংটি অতিক্রম করছিলাম, তাই যখন পাইথন ৩.x এ এটি পরীক্ষা করে দেখতে পেলাম এটি ব্যর্থ হয়েছিল এবং এটি ঠিক করতে হয়েছিল।

    ব্যবহারের আরেকটি সুবিধা io.StringIOহ'ল সর্বজনীন নিউলাইনগুলির সমর্থন। আপনি শব্দ যুক্তি পাস যদি newline=''মধ্যে io.StringIO, এটা কোনো লাইন বিভক্ত করতে সক্ষম হবে \n, \r\nঅথবা \r। আমি খুঁজে পেয়েছি যে বিশেষভাবে StringIO.StringIOট্রিপ আপ হবে \r

    মনে রাখবেন যদি আপনি আমদানি BytesIOবা StringIOথেকে six, আপনি পেতে StringIO.StringIOপাইথন 2.x এবং উপযুক্ত ক্লাসে থেকে ioপাইথন 3.x. মধ্যে আপনি যদি আমার পূর্ববর্তী অনুচ্ছেদের মূল্যায়নের সাথে একমত হন তবে এটি আসলে এমন একটি ক্ষেত্রে যেখানে আপনার এড়ানো উচিত sixএবং ioপরিবর্তে কেবল আমদানি করা উচিত ।

  • আপনি যদি পাইথন 2.5 বা নিম্ন এবং 3.x সমর্থন করেন: আপনার StringIO.StringIO2.5 বা নিম্নের প্রয়োজন হবে , যাতে আপনি পাশাপাশি ব্যবহার করতে পারেন six। তবে বুঝতে হবে যে সাধারণত 2.5 এবং 3.x উভয়ই সমর্থন করা খুব কঠিন, তাই আপনার যদি সম্ভব হয় তবে আপনার সর্বনিম্ন সমর্থিত সংস্করণটি ২.6 এ ধাক্কা দেওয়ার কথা বিবেচনা করা উচিত।


7

এখান থেকে উদাহরণগুলি পাইথনের ৩.৩.২ এর সাথে কাজ করার জন্য , আপনি নীচে পুনরায় লিখতে পারেন:

import io
data =io.BytesIO(b"1, 2, 3\n4, 5, 6") 
import numpy
numpy.genfromtxt(data, delimiter=",")

পরিবর্তনের কারণটি হতে পারে যে কোনও ফাইলের সামগ্রীতে ডেটা (বাইট) থাকে যা কোনওভাবে ডিকোড হওয়া পর্যন্ত পাঠ্য তৈরি করে না। genfrombytesএর চেয়ে ভাল নাম হতে পারে genfromtxt


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