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

У меня есть проект на python, который из 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 

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

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

в

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

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

Согласно 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 . Тем не менее, из спецификации функции, я думаю, что передача имени файла должна работать.

Это на самом деле ошибка в 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.

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

 # For instance, interpret as UTF-8 (depends on your source) self.comments = self.comments.decode('utf-8') 

Вместо:

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

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

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

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