2012-08-11 22 views
192

में स्ट्रिंगियो मैं पाइथन 3.2.1 का उपयोग कर रहा हूं और मैं StringIO मॉड्यूल आयात नहीं कर सकता। मैं io.StringIO का उपयोग करें और यह काम करता है, लेकिन मैं numpy के genfromtxt इस तरह से इसका इस्तेमाल नहीं कर सकते हैं:पायथन 3

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' 

उत्तर

50

पायथन 3 numpy.genfromtxt पर बाइट स्ट्रीम की अपेक्षा करता है। निम्नलिखित का उपयोग करें:

numpy.genfromtxt(io.BytesIO(x.encode())) 
342

when i write import StringIO it says there is no such module.

What’s New In Python 3.0 से:

The StringIO and cStringIO modules are gone. Instead, import the io module and use io.StringIO or io.BytesIO for text and data respectively.


एक कुछ अजगर 2 कोड फिक्सिंग भी अजगर 3 (चेतावनी एम्प्टर) में काम करने के लिए की संभवतः उपयोगी विधि:

try: 
    from StringIO import StringIO 
except ImportError: 
    from io import StringIO 

Note: This example may be tangential to the main issue of the question and is included only as something to consider when generically addressing the missing StringIO module. For a more direct solution the the message TypeError: Can't convert 'bytes' object to str implicitly , see this answer .

+6

, उल्लेख इन ही नहीं हैं वर्थ तो आप कर सकते हैं समाप्त यदि आप अलगाव में यह परिवर्तन करते हैं तो 'TypeError's (स्ट्रिंग तर्क अपेक्षित,' बाइट्स 'प्राप्त हुआ) के साथ। आपको पाइथन 3 में बीटीई और स्ट्र (यूनिकोड) को ध्यान से अंतर करने की आवश्यकता है। –

+5

मेरे जैसे नए लोगों के लिए: आईओ आयात से स्ट्रिंगियो का मतलब है कि आप इसे स्ट्रिंगियो() के रूप में कहते हैं, io.StringIO() नहीं। – Noumenon

+4

वास्तव में पाइथन 2 और 3 के साथ संगत कैसे हो: केवल 'आईओ आयात स्ट्रिंगियो' –

21

मेरे मामले में मैं का इस्तेमाल किया है:

from io import StringIO 
11

आपके प्रश्न के लिए ओपी और आपके उत्तर के लिए रोमन धन्यवाद। मुझे यह खोजने के लिए थोड़ा सा खोजना पड़ा; मुझे आशा है कि निम्नलिखित दूसरों की मदद करेगा।

अजगर 2,7

देखें: https://docs.scipy.org/doc/numpy-dev/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 = "| Sx", जहाँ x = के किसी भी {1, 2, 3, ...}:

dtypes. Difference between S1 and S2 in Python

"| एस 1 और | S2 तार डेटा प्रकार वर्णनकर्ता कर रहे हैं; पहले इसका मतलब सरणी लंबाई 1, लंबाई 2. के दूसरे के तार रखती है ... "

8

आप six मॉड्यूल से StringIO उपयोग कर सकते हैं:

import six 
import numpy 

x = "1 3\n 4.5 8" 
numpy.genfromtxt(six.StringIO(x)) 
-5

इस

StringIO से

कोशिश आयात स्ट्रिंगियो

x = "1 3 \ n 4।5 से 8 "

numpy.genfromtxt (StringIO (x))

3

आदेश अजगर 3.5.2 के साथ here काम से उदाहरण बनाने के लिए, आप इस प्रकार पुनर्लेखन सकते हैं:

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

कारण बदलाव के लिए हो सकता है कि एक फ़ाइल की सामग्री डेटा (बाइट्स) जो जब तक किसी भी तरह डीकोड किया जा रहा पाठ नहीं बनाते हैं में है। genfrombytesgenfromtxt तुलना में एक बेहतर नाम हो सकता है।