Ошибка при работе на .csv с load_csv - PullRequest
1 голос
/ 30 марта 2019

Я пытаюсь работать с приведенным ниже кодом :

ds = load_csv('C:\\User.csv')
f = open(ds,'r')
lines = f.readlines()[1:]
print(lines)
f.close()

Первая строка набора данных - строка.Я получаю следующее ошибка :

TypeError: expected str, bytes or os.PathLike object, not list

Хотя, когда я пытаюсь открыть файл с кодом ниже, он работает :

filename='C:\\User.csv'
f = open(filename,'r')
lines = f.readlines()[1:]
print(lines)
f.close()

Я игнорирую первую строку, потому что ее строка и остальная часть набора данных являются плавающими.

Обновление:

load_csv

def load_csv(ds):
    dataset = list()
    with open(ds, 'r') as file:
        csv_reader = reader(file)
        for row in csv_reader:
            if not row:
                continue
            dataset.append(row)
            return dataset

Даже еслиЯ использую этот способ до сих пор получить ошибка :

ds = load_csv('C:\\Users.csv')
minmax = dataset_minmax(ds)
normalize_dataset(ds, minmax)

def dataset_minmax(dataset):
    minmax = list()
    for i in range(len(dataset[0])):
        col_values = [row[i] for row in dataset]
        value_min = min(col_values)
        value_max = max(col_values)
        minmax.append([value_min, value_max])
    return minmax

def normalize_dataset(dataset, minmax):
    for row in dataset:
        for i in range(len(row)):
            row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])

Это дает ошибка на:

row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])

Ошибка:

TypeError: unsupported operand type(s) for -: 'str' and 'str'

Ответы [ 3 ]

0 голосов
/ 30 марта 2019

Посмотрите на ваши первые две строки, где это не работает:

ds = load_csv('C:\\User.csv')
f = open(ds,'r')

ds - это возвращаемый объект (я полагаю, из TensorFlow), который содержит данные. Затем вы открываете его, как будто это имя файла. Вот почему переводчик жалуется. ds - это набор данных, а не строка, представляющая файл.

Это работает в другом примере, потому что вы используете имя файла.

0 голосов
/ 30 марта 2019

Поскольку теперь вы получаете другую ошибку, я дам второй ответ.

Эта ошибка означает, что две переменные в вашем вычитании являются строками, а не числами.

In [1]: 5 - 3
Out[1]: 2

In [2]: '5' - '3'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-4ef7506473f1> in <module>
----> 1 '5' - '3'

TypeError: unsupported operand type(s) for -: 'str' and 'str'

Это потому, что читатель CSV предполагает, что все является строкой. Вам необходимо преобразовать его в числа с плавающей точкой, например, изменив load_csv на что-то вроде dataset.append(list(map(float, row))) вместо существующего оператора добавления.

Мин-макс не терпит неудачу, потому что мин и макс Python работают и со строками:

In [3]: min('f', 'o', 'o', 'b', 'a', 'r')
Out[3]: 'a'

Однако, возможно, он дает вам неправильные ответы:

In [4]: min('2.0', '10.0')
Out[4]: '10.0'

Кстати, если вы много делаете в этом направлении, вы, вероятно, выиграете от использования пакета Pandas вместо того, чтобы свернуть свой собственный.

0 голосов
/ 30 марта 2019

Я предполагаю, что ошибка в команде open в вашем коде. Причина, по которой это не удается, заключается в том, что команда open ожидает объект, похожий на путь к операционной системе string, который является дескриптором файла, который он может открыть (как сказано в сообщении об ошибке). Функция load_csv, вероятно, возвращает список, который является несовместимым форматом для open

...