【问题标题】:Converted to Float and Int, TypeError: can't multiply sequence by non-int of type 'float' Python 2.7转换为 Float 和 Int,TypeError: can't multiply sequence by non-int of type 'float' Python 2.7
【发布时间】:2016-01-27 11:44:39
【问题描述】:

我正在尝试打开一个 CSV 文件,遍历其行并将行的最后一部分转换为通过将现有值与浮点数相乘而创建的新数字。

CSV 文件的Row[8] 返回一个字符串,该字符串表示为intNaNfloat。我已经替换了NaN,发现了关于将字符串限制为 5 个字符的切片。然后我尝试使用条件将适当的字符串转换为intfloat

for 循环的最后一部分,我试图将 CSV 文件的适当部分乘以浮点数(1.98),这就是我得到错误的地方(TypeError: can't multiply sequence by non-int of type 'float')。如果我将其更改为 2,即 int,则脚本运行。

我觉得问题一定存在于使用if elseintfloat 的字符串转换中,但我不确定在哪里。任何提示将不胜感激。

for row in csv_f:
        row[8] = row[8][:5]
        if isinstance(row[8], float):
            row[8] = float(row[8])
        if isinstance(row[8], int):
            row[8] = int(row[8])
        row[8] = row[8] * 1.9
        print row[8]

【问题讨论】:

  • isinstance() 在这两种情况下都不会成立,因为row[8] 始终是一个字符串。如果您对自己的数据有信心,可以改用'.' in row[8] 作为浮点数的测试。
  • 乘以一个 int 是可行的,因为您正在乘以字符串的实例。在您的情况下,如果您在行值中有 "9.99" 并乘以整数 2,则变为 "9.999.99"

标签: python python-2.7 csv


【解决方案1】:

row[8] 是一个字符串

type(row[8])
<class 'str'>

条件if isinstance 永远不会执行。

为什么当你更改为2 然后工作?因为'a' * 2 == 'aa'

【讨论】:

    【解决方案2】:

    在你的代码中,都没有

        if isinstance(row[8], float):
            row[8] = float(row[8])
        if isinstance(row[8], int):
            row[8] = int(row[8])
    

    将被执行,因为row[8] 的类型为string

    您只需将其更改为row[8] = float(row[8]) 即可。

    【讨论】:

    • 我建议添加一个安全措施:if... elif... else: raise TypeError("value (%s) is unexpectedly of type `%s'"%(row[8],type(row[8]))) 这是一个很好的一般做法(体现了“比抱歉更安全”的原则):当发生不应该发生的事情时,总是让代码阻塞。 (还要注意值周围的引号:它们有助于查看前导/尾随空格)
    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 2013-08-25
    • 2021-01-06
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多