输入:txt文件
iam使用文件包含大量数据,我必须在指定句子后得到一些数字然后计算这些数字的avrg
# Use the file name mbox-short.txt as the file name
count = 0
fname = raw_input("Enter file name: ")
fh = open(fname)
for lines in fh:
if lines.startswith ("X-DSPAM-Confidence:"):
lines = float (lines [20:50])
count = count +1
print lines
print count
我从这里得到的是
0.8475
0.6178
0.6961
0.7565
0.7626
0.7556
0.7002
0.7615
0.7601
0.7605
0.6959
0.7606
0.7559
0.7605
0.6932
0.7558
0.6526
0.6948
0.6528
0.7002
0.7554
0.6956
0.6959
0.7556
0.9846
0.8509
0.9907
循环到达行以txt开头" X-DSPAM-Confidence:" 并从20:50(结束时)剥离它
然后让我得到2个东西得到所需的数字列表和计数,这将有助于以后,现在我需要将数字加到calc avrg。总和/计数
我该怎么做?如果我得到长代码,寻找最简单的方法不是问题
我刚刚改进了代码,删除了不必要的事情,对不起
打印不重要的东西,但只是为了看看我在做什么,因为我是python的新手
答案 0 :(得分:1)
如果我们看到您的数据样本会有所帮助,但您应该可以这样做:
sum_lines = sum(lines)
avg_lines = sum_lines / count
sum()
是一个内置函数,它将对可迭代求和。
我也想知道为什么你在做
lines = float (lines [20:50])
我认为如果它们是多个以逗号分隔的浮点数,您可能希望使用float_list
函数将其分配给sum
等列表变量,然后sum()
。
如果您不想保存平均值,可以添加第三个print
print sum(float_list) / count
更新以反映OP更新
是的,你肯定想创建一个列表。代替lines = float (lines [20:50])
执行此操作:
float_list = []
float_list = float(line[20:50])
更好的方法是使用列表理解。
float_list = [float(lines[20:50] for lines in fh if lines.startwith("X-DSPAM-Confidence:")]
...更新
我认为我误解了您对切片[20:50]的原始用法,表示每行多个数字。
如果它只是一个数字,那就是这个,这基本上是Padraic Cunningham发布的答案:
# Use the file name mbox-short.txt as the file name
fname = raw_input("Enter file name: ")
fh = open(fname)
float_list = [float(lines[20:50] for lines in fh if lines.startwith("X-DSPAM-Confidence:")]
list_sum = sum(float_list)
count = len(float_list)
list_avg = list_sum / count
为了将来参考,在原始问题中发布输入数据的示例以及代码和所需输出是有帮助的。
答案 1 :(得分:1)
使用您自己的代码只需跟踪总数并在结尾处划分:
count = 0
total = 0
fname = raw_input("Enter file name: ")
fh = open(fname)
for lines in fh:
if lines.startswith ("X-DSPAM-Confidence:"):
count += 1
total += float (lines [20:50])
print lines
print count
print(total/count)
如果您需要存储所有数据,那么列表comp将是存储所有浮点数的最佳方法,然后求和并除以长度以获得平均值:
fname = raw_input("Enter file name: ")
with open(fname) as f:
all_data = [float(line[20:50]) for line in f if line.startswith ("X-DSPAM-Confidence:")]
avg = sum(all_data) / len(all_data)
print(all_data)
print(avg)
答案 2 :(得分:-1)
主要取决于您的数字的格式,是CSV,是他们自己的行等。无论如何,一般的解决方案:
正如一些评论所指出的那样,你的第一个循环会破坏你的迭代器,所以我把两个循环结合起来。 if else是多余的,因为if not
可以正常工作。
count = 0
sum = 0
fname = raw_input("Enter file name: ")
fh = open(fname,'r')
lines = fh.readlines()
fh.close()
for line in lines:
if line.startswith ("X-DSPAM-Confidence:"):
continue
else:
line = float(line)
count = count +1
sum += line
avg = sum/count
print avg