【问题标题】:integers when reading a csv file in python在python中读取csv文件时的整数
【发布时间】:2011-07-29 14:41:16
【问题描述】:

我正在尝试在 python 中读取一个 csv 文件,这样我就可以使用 numpy.average 找到其中一列中值的平均值。 我的脚本如下所示:

import os
import numpy
import csv

listing = os.listdir('/path/to/directory/of/files/i/need')
os.chdir('/path/to/directory/of/files/i/need')


for file in listing[1:]:    
    r = csv.reader(open(file, 'rU'))   
    for row in r:
        if len(row)<2:continue
        if float(row[2]) <=0.05:
            avg = numpy.average(float(row[2]))
    print avg

但我不断收到错误 ValueError:float() 的无效文字。 csv 阅读器似乎将数字读取为字符串,并且不允许我将其转换为浮点数。有什么建议吗?

【问题讨论】:

  • 您能否提供 csv 文件中的样本,其中包含脚本阻塞的值之一?
  • 我猜你已经向它传递了一个空字符串,所以你需要为此添加一个简单的检查 - 'if row[2].strip() 和 float(row[2])
  • @Artisom:这将导致错误消息“float() 的空字符串”而不是“float() 的无效文字”。
  • @Sven 但我已经尝试过了,它会抛出 'ValueError: invalid literal for float():' - 但我使用的是 IronPython 2.6。已签入 python 2.6 并得到“float() 的空字符串”
  • 只记得每个文件的第一行都是字符串。但是,当我尝试通过 for row in r[1:]: 而不是 for row in r: 来跳过第一行时,我得到 TypeError: '_csv.reader' object is unsubscriptable

标签: python csv floating-point


【解决方案1】:

根据 cmets 判断,您的程序遇到了标题问题。

两种解决方案是使用r.next(),在for 循环之前跳过一行,或者使用DictReader 类。 DictReader 类的优点是您可以将每一行视为字典而不是元组,这在某些情况下可能会提高可读性,但您必须在构造函数中将标头列表传递给它。

【讨论】:

    【解决方案2】:

    改变:

    float(row[2])
    

    到:

    float(row[2].strip("'\""))
    

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 2011-03-07
      • 2022-01-24
      • 2021-12-08
      相关资源
      最近更新 更多