Использование numpy.genfromtxt дает TypeError: невозможно неявно преобразовать объект 'bytes' в str

У меня есть проект на питоне с сайта kaggle.com. У меня проблемы с чтением набора данных. Он содержит один CSV-файл. Нам нужно прочитать его, поместить цель и обучить его части в массивы.

Вот первые 3 строки набора данных (целевой столбец — это 19-й столбец, а функции — первые 18 столбцов):

user    gender  age how_tall_in_meters  weight  body_mass_index x1  
debora  Woman   46  1.62    75  28.6    -3  
debora  Woman   46  1.62    75  28.6    -3  

Целевой столбец, который здесь не показан, имеет строковые значения.

from pandas import read_csv
import numpy as np
from sklearn.linear_model.stochastic_gradient import SGDClassifier
from sklearn import preprocessing
import sklearn.metrics as metrics
from sklearn.cross_validation import train_test_split

#d = pd.read_csv("data.csv", dtype={'A': np.str(), 'B': np.str(), 'S': np.str()})

dataset = np.genfromtxt(open('data.csv','r'), delimiter=',', dtype='f8')[1:]
target = np.array([x[19] for x in dataset])
train = np.array([x[1:] for x in dataset])

print(target)

Ошибка, которую я получаю:

Traceback (most recent call last):
  File "C:\Users\Cameron\Desktop\Project - Machine learning\datafilesforproj\SGD_classifier.py", line 12, in <module>
    dataset = np.genfromtxt(open('data.csv','r'), delimiter=',', dtype='f8')[1:]
  File "C:\Python33\lib\site-packages\numpy\lib\npyio.py", line 1380, in genfromtxt
    first_values = split_line(first_line)
  File "C:\Python33\lib\site-packages\numpy\lib\_iotools.py", line 217, in _delimited_splitter
    line = line.split(self.comments)[0]
TypeError: Can't convert 'bytes' object to str implicitly

person user3451169    schedule 27.04.2014    source источник
comment
Пожалуйста, уделите некоторое время правильному форматированию кода.   -  person Hooked    schedule 27.04.2014
comment
возможный дубликат Ошибка Python3: TypeError: не удается преобразовать объект 'bytes' в str неявно   -  person CodeManX    schedule 27.04.2014
comment
Кроме того, попробуйте придумать минимальный рабочий пример. Ваша проблема не имеет ничего общего с Kaggle.com. И вы должны попытаться сократить свою программу до 2 строк, чтобы изолировать проблему. Кроме того, создайте чрезвычайно простой файл .csv для практики.   -  person Garrett    schedule 02.10.2014
comment
@CoDEmanX Нет, это не так. Это зависит от numpy, ср. мой ответ.   -  person smheidrich    schedule 27.02.2017


Ответы (5)


Что сработало для меня, так это изменить линию

dataset = np.genfromtxt(open('data.csv','r'), delimiter=',', dtype='f8')[1:]

to

dataset = np.genfromtxt('data.csv', delimiter=',', dtype='f8')[1:]

(к сожалению, я не совсем уверен, в чем была основная проблема)

person Garrett    schedule 02.10.2014
comment
совсем не помогло... Тот же файл, что и OP, это содержимое набора данных: [nan, nan] - person andrea; 19.03.2016

На самом деле это ошибка в numpy, ср. проблема № 3184.

Я просто скопирую обходной путь, который я представил там:

import functools
import io
import numpy as np
import sys

genfromtxt_old = np.genfromtxt
@functools.wraps(genfromtxt_old)
def genfromtxt_py3_fixed(f, encoding="utf-8", *args, **kwargs):
  if isinstance(f, io.TextIOBase):
    if hasattr(f, "buffer") and hasattr(f.buffer, "raw") and \
    isinstance(f.buffer.raw, io.FileIO):
      # Best case: get underlying FileIO stream (binary!) and use that
      fb = f.buffer.raw
      # Reset cursor on the underlying object to match that on wrapper
      fb.seek(f.tell())
      result = genfromtxt_old(fb, *args, **kwargs)
      # Reset cursor on wrapper to match that of the underlying object
      f.seek(fb.tell())
    else:
      # Not very good but works: Put entire contents into BytesIO object,
      # otherwise same ideas as above
      old_cursor_pos = f.tell()
      fb = io.BytesIO(bytes(f.read(), encoding=encoding))
      result = genfromtxt_old(fb, *args, **kwargs)
      f.seek(old_cursor_pos + fb.tell())
  else:
    result = genfromtxt_old(f, *args, **kwargs)
  return result

if sys.version_info >= (3,):
  np.genfromtxt = genfromtxt_py3_fixed

Поместив это в начало кода, вы можете снова использовать np.genfromtxt, и он должен нормально работать в Python 3.

person smheidrich    schedule 27.02.2017

Согласно https://mail.python.org/pipermail/python-list/2012-April/622487.html вам, вероятно, понадобится

import io
import sys
inpstream = io.open('data.csv','rb')
dataset = np.genfromtxt(inpstream, delimiter=',', dtype='f8')[1:]

В примерах, показанных на http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html объекты, используемые в качестве файла, относятся к классу StringIO. Тем не менее, из спецификации функции я предполагаю, что передача имени файла должна работать.

person sancho.s ReinstateMonicaCellio    schedule 12.09.2016

Вам нужно явно декодировать объект bytes в объект str, как подразумевает TypeError.

# For instance, interpret as UTF-8 (depends on your source)
self.comments = self.comments.decode('utf-8')
person CodeManX    schedule 27.04.2014
comment
Рассматриваемый код находится внутри библиотеки numpy. Вы предполагаете, что это пустая ошибка? Если это так, отредактируйте свой ответ, чтобы уточнить это. - person max; 23.08.2015
comment
Согласен, я запускаю первый пример отсюда, и это та же ошибка: docs.scipy.org/doc/numpy-1.10.0/reference/generated/ - person andrea; 19.03.2016

Вместо:

dataset = np.genfromtxt(open('data.csv','r'), delimiter=',', dtype='f8')[1:]

попробуй это:

dataset = np.genfromtxt('C:\\\\..\\\\..\\\train.csv', delimiter=',', dtype='None')[1:]

Обратите внимание, что вам нужно использовать дополнительный «\», чтобы избежать другого.

person user3843005    schedule 16.07.2014