【问题标题】:Error while working on .csv with load_csv使用 load_csv 处理 .csv 时出错
【发布时间】:2019-08-21 09:05:38
【问题描述】:

我正在尝试处理以下代码

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()

我忽略了第一行,因为它的字符串和数据集的其余部分是浮动的。

更新:

加载_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'

【问题讨论】:

  • load_csv 函数来自哪里?使用 pandas read_csv 函数很常见。
  • 另外,在以后添加行号并提及您收到错误的行!
  • 用 load_csv 更新

标签: python python-3.x csv dataset load-csv


【解决方案1】:

我猜错误出在您代码中的open 命令中。失败的原因是open 命令需要一个string 或操作系统路径类对象,它是它可以打开的文件的句柄(就像它在错误中所说的那样)。函数load_csv 可能返回一个与open 格式不兼容的列表

【讨论】:

  • 在您更新之后,我的解释似乎是在合理的假设下做出的:)
【解决方案2】:

看看你的前两行不起作用:

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

ds 是一个返回的对象(我假设来自 TensorFlow?),其中包含数据。然后像打开文件名一样打开它。这就是口译员抱怨的原因。 ds 是数据集,而不是代表文件的字符串。

它在另一个示例中有效,因为您使用了文件名。

【讨论】:

  • 你可以删除这个答案,这样我们就可以处理上面的问题了
【解决方案3】:

既然你现在得到一个不同的错误,我会给出第二个答案。

这个错误意味着你的减法中的两个变量是字符串,而不是数字。

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))) 的操作,而不是现有的 append 语句。

min-max 的东西不会失败,因为 Python 的 min 和 max 也适用于字符串:

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

但是,它可能会给你错误的答案:

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

顺便说一句,如果您在这些方面做了很多工作,您可能会从使用 Pandas 包而不是自己滚动包中受益。

【讨论】:

  • 即使我将该行更改为 dataset.append(list(map(float, row))),它仍然给出错误'dataset.append(list(map(float, row))) ValueError : 无法将字符串转换为浮点数:'7;0.27;0.36;20.7;0.045;45;170;1.001;3;0.45;8.8;6''
  • 您的输入数据是分号分隔的,不是逗号分隔的。 CSV 会有一行 '7,0.27,0.36,...' 而不是 '7;0.27;0.36;...'。在创建 CSV reader 时使用 delimiter=';'
  • row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0]) ZeroDivisionError: 浮点除法零
  • 这是一个不同的错误。显然,您有一行最小值和最大值相同。您可能想尝试打印出中间数据并查看您拥有的数据。或者利用现有的其他工具:将其加载到 pandas 中,然后执行此操作:stackoverflow.com/a/41532180/4205735
猜你喜欢
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多