将数字数据从CSV转换为浮点数并在Python中获得平均值

时间:2016-09-16 09:43:23

标签: python

我有以下python函数,它接受目录和文件名的输入。

它从CSV文件中读取,该文件可以有一行“null”作为值。

tps.csv

1
2
3
4
null
5
6

当它从csv读取'null'时,它会给我一个错误(下面),即使我在读取'null'时有一个if条件跳过。

ValueError:无法将字符串转换为float:null

代码:

def computeMean(dir_name, filename):
    csv_filename = '{}/{}'.format(dir_name, filename)
    numbers = []
    with open(csv_filename) as f:
        for line in f:
            if line is not 'null':
                number_on_line = float(line)
                numbers.append(number_on_line)

    return sum(numbers)/len(numbers)

我需要添加或更改哪些内容才能忽略/跳过非数值?

3 个答案:

答案 0 :(得分:2)

在您的文件中,行以\n结尾。然后你有字符串null\n,而不是null。 处理这种情况的最佳方法可能是使用strip方法,该方法专为此而设计:

if line.strip() != 'null':
    ...

请注意,此处未使用isBecause is doesn't work as you think

答案 1 :(得分:1)

使用比较代替is not

if line != 'null':

is / is not检查对象标识,而== / !=则比较对象的值。在您的情况下,该行与常量字符串null具有相同的值,但它们是不同的对象。

请注意,由于Python的内部结构,将字符串与is进行比较有时会起作用,但并非总是如此。

>>> 'foo' is 'foo'
True
>>> 'foobar'[:3] is 'foo'
False 

答案 2 :(得分:1)

is的运作方式与str in strstr == str不同,因此错误

我相信你可以用列表理解

来做到这一点
with open(csv_filename) as f:
    numbers = [float(l.strip()) for l in f if l != 'null']
return 0 if len(numbers) == 0 else sum(numbers) / float(len(numbers))