我有以下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)
我需要添加或更改哪些内容才能忽略/跳过非数值?
答案 0 :(得分:2)
在您的文件中,行以\n
结尾。然后你有字符串null\n
,而不是null
。
处理这种情况的最佳方法可能是使用strip
方法,该方法专为此而设计:
if line.strip() != 'null':
...
请注意,此处未使用is
。 Because 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 str
或str == 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))