我有一个看起来像这样的文本文件;值以制表符分隔:
diamond orange pear loc1 . + 0.0 0.0 0.0 0.0 1.0 1.2 3.4
diamond orange pear loc2 . + 1.0 0.0 0.0 0.0 1.0 1.2 2.3
diamond orange pear loc3 . + 2.0 0.0 3.0 0.0 0.0 0.0 1.4
# ......
对于文件中的每一行,我想要将前3个值之和除以最后4个值之和的比率。输出看起来像:
diamond orange pear loc1 . + 0
diamond orange pear loc2 . + 0.22
diamond orange pear loc3 . + 4.28
......
我想在python中这样做。
with open('/path/to/file/') as inFile:
inFile.next()
for line in inFile:
data = cols[6:]
data = map(float,data)
sum_3 = [sum[for x in x data[0:3]]
sum_last = [sum[for x in x data[4:7]]
average = sum_3/sum_last
这不起作用,我希望能得到一些建议吗?
答案 0 :(得分:3)
你没有显示cols
来自哪里,但看起来你并没有实际拆分每一行,在这种情况下,你留下的是一个字符串而你正试图工作使用该字符串的字符,没有第一个字符6.将单个字符映射到浮点值不会为您提供所需的数据。
接下来,sum()
是一个函数,但是您使用索引语法,sum[...]
将抛出异常。如果切片生成sum(data[:3])
s的序列,您不需要使用列表推导来从切片中获取值,只需float
即可。
你有一个制表符分隔的文件,最简单的方法是使用csv
模块进行拆分:
import csv
with open('/path/to/file/') as infile:
reader = csv.reader(infile, delimiter='\t')
next(reader) # skip first row
for row in reader:
first3, last = row[-7:-4], row[-4:]
try:
average = sum(map(float, first3)) / sum(map(float, last))
except ZeroDivisionError:
# last four values are all zero; just set the average to zero.
average = 0
我已经允许最后4个值全部为零;那时你要除以零,并且你想要处理那种情况下引发的异常。