Saya menggunakan Python 3.2.1 dan saya tidak bisa mengimpor StringIO
modul. Saya menggunakan
io.StringIO
dan bekerja, tapi aku tidak bisa menggunakannya dengan numpy
's genfromtxt
seperti ini:
x="1 3\n 4.5 8"
numpy.genfromtxt(io.StringIO(x))
Saya mendapatkan kesalahan berikut:
TypeError: Can't convert 'bytes' object to str implicitly
dan ketika saya menulis import StringIO
itu mengatakan
ImportError: No module named 'StringIO'
sumber
TypeError
s (argumen string diharapkan, mendapat 'byte') jika Anda membuat perubahan ini secara terpisah. Anda perlu membedakan btyes dan str (unicode) dengan hati-hati dengan python 3.from io import StringIO
StringIO
hilang danfrom io import BytesIO
harus diterapkan sebagai gantinya. Menguji diri saya pada python 3.5 @ eclipse pyDev + win7 x64. Tolong beri tahu saya kalau saya salah, terima kasih.Dalam kasus saya, saya telah menggunakan:
sumber
Pada Python 3
numpy.genfromtxt
mengharapkan aliran byte. Gunakan yang berikut ini:sumber
Terima kasih OP atas pertanyaan Anda, dan Roman atas jawaban Anda. Saya harus mencari sedikit untuk menemukan ini; Saya harap yang berikut ini membantu orang lain.
Python 2.7
Lihat: https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html
Python 3.5:
Ke samping:
dtype = "| Sx", di mana x = sembarang dari {1, 2, 3, ...}:
tipe. Perbedaan antara S1 dan S2 dalam Python
"String | S1 dan | S2 adalah deskriptor tipe data; yang pertama berarti array memiliki string dengan panjang 1, yang kedua dari panjang 2. ..."
sumber
Anda dapat menggunakan StringIO dari enam modul:
sumber
Kode Roman Shapovalov harus bekerja dalam Python 3.x dan juga Python 2.6 / 2.7. Ini dia lagi dengan contoh lengkap:
Keluaran:
Penjelasan untuk Python 3.x:
numpy.genfromtxt
mengambil aliran byte (objek seperti file yang ditafsirkan sebagai byte alih-alih Unicode).io.BytesIO
mengambil string byte dan mengembalikan aliran byte.io.StringIO
, di sisi lain, akan mengambil string Unicode dan dan mengembalikan aliran Unicode.x
akan diberi string literal, yang dalam Python 3.x adalah string Unicode.encode()
mengambil string Unicodex
dan membuat byte string darinya, sehingga memberikanio.BytesIO
argumen yang valid.Satu-satunya perbedaan untuk Python 2.6 / 2.7 adalah
x
string byte (dengan asumsifrom __future__ import unicode_literals
tidak digunakan), dan kemudianencode()
mengambil string bytex
dan masih membuat string byte yang sama darinya. Jadi hasilnya sama.Karena ini adalah salah satu pertanyaan SO yang paling populer
StringIO
, inilah beberapa penjelasan lebih lanjut tentang pernyataan impor dan versi Python yang berbeda.Berikut adalah kelas-kelas yang mengambil string dan mengembalikan aliran:
io.BytesIO
(Python 2.6, 2.7, dan 3.x) - Mengambil string byte. Mengembalikan aliran byte.io.StringIO
(Python 2.6, 2.7, dan 3.x) - Mengambil string Unicode. Mengembalikan aliran Unicode.StringIO.StringIO
(Python 2.x) - Mengambil string byte atau string Unicode. Jika byte string, mengembalikan aliran byte. Jika string Unicode, mengembalikan aliran Unicode.cStringIO.StringIO
(Python 2.x) - Versi lebih cepat dariStringIO.StringIO
, tetapi tidak dapat mengambil string Unicode yang berisi karakter non-ASCII.Catatan yang
StringIO.StringIO
diimpor sebagaifrom StringIO import StringIO
, lalu digunakan sebagaiStringIO(...)
. Entah itu, atau Anda lakukanimport StringIO
dan kemudian gunakanStringIO.StringIO(...)
. Nama modul dan nama kelas kebetulan sama. Mirip sepertidatetime
itu.Apa yang harus digunakan, tergantung pada versi Python yang didukung:
Jika Anda hanya mendukung Python 3.x: Cukup gunakan
io.BytesIO
atauio.StringIO
tergantung pada jenis data yang Anda gunakan .Jika Anda mendukung Python 2.6 / 2.7 dan 3.x, atau mencoba mentransisikan kode Anda dari 2.6 / 2.7 ke 3.x: Opsi termudah adalah masih menggunakan
io.BytesIO
atauio.StringIO
. MeskipunStringIO.StringIO
fleksibel dan dengan demikian tampaknya lebih disukai untuk 2.6 / 2.7, fleksibilitas itu dapat menutupi bug yang akan bermanifestasi dalam 3.x. Sebagai contoh, saya punya beberapa kode yang digunakanStringIO.StringIO
atauio.StringIO
tergantung pada versi Python, tapi saya benar-benar melewati string byte, jadi ketika saya sempat mengujinya di Python 3.x gagal dan harus diperbaiki.Keuntungan lain menggunakan
io.StringIO
adalah dukungan untuk baris baru universal. Jika Anda melewatkan argumen kata kuncinewline=''
ke dalamio.StringIO
, itu akan dapat membagi baris pada salah\n
,\r\n
atau\r
. Saya menemukan bahwaStringIO.StringIO
akan naik pada\r
khususnya.Perhatikan bahwa jika Anda mengimpor
BytesIO
atauStringIO
darisix
, Anda mendapatkanStringIO.StringIO
Python 2.x dan kelas yang sesuai dariio
dalam Python 3.x. Jika Anda setuju dengan penilaian paragraf saya sebelumnya, ini sebenarnya adalah satu kasus di mana Anda harus menghindarisix
dan hanya mengimpor dariio
.Jika Anda mendukung Python 2.5 atau lebih rendah dan 3.x: Anda perlu
StringIO.StringIO
untuk 2.5 atau lebih rendah, jadi sebaiknya Anda gunakansix
. Tetapi sadari bahwa umumnya sangat sulit untuk mendukung 2.5 dan 3.x, jadi Anda harus mempertimbangkan untuk menabrak versi terendah yang didukung ke 2.6 jika memungkinkan.sumber
Untuk membuat contoh dari sini berfungsi dengan Python 3.5.2, Anda dapat menulis ulang sebagai berikut:
Alasan untuk perubahan mungkin karena konten file dalam data (byte) yang tidak membuat teks sampai diterjemahkan entah bagaimana.
genfrombytes
mungkin nama yang lebih baik daripadagenfromtxt
.sumber
coba ini
dari StringIO import StringIO
x = "1 3 \ n 4,5 8"
numpy.genfromtxt (StringIO (x))
sumber