我刚开始使用 python,我有大约 6000 个 .txt 文件,每个文件在一列中包含几个数字,例如:
文件1.txt:
2
43
78
文件2.txt:
98
12
and so on
我想读取它们并将它们存储在一个数组中并计算其平均值。 (2,43,78,98,12..) 的平均值,即所有文件中的所有数字均应为 1 当我读取和存储它们时,它们看起来像:
['2, 43, 78', '98, 12',..]
...(我去掉了'\n') 但是当我使用 ave = sum(a)\float(len(a)) 时,我得到了一个错误。 我究竟做错了什么? 有什么我错过的或其他方法吗?
代码:
import fnmatch
import os
rootPath = 'D:/Data'
pattern = '*.txt'
all_data = []
for root, dirs, files in os.walk(rootPath):
for filename in fnmatch.filter(files, pattern):
#print( filename )
name = os.path.join(root, filename)
str = open(name, 'r').read()
#print str
all_data.append(str)
a=[item.replace('\n', ' ') for item in all_data]
#print a
for val in a:
values = map(float, val.split(", "))
ave = sum(values)/len(values)
print ave
我得到错误:
invalid literal for float()
请您参考如下方法:
sum("abc") 未定义。 sum("2, 43") 也不是。 sum 仅适用于数字类型。
您需要先拆分行并将值转换为数值(我在这里使用了float,因为这样sum 将是一个float,因此无需将 len 转换为 float):
rows = ['2 43 78', '98 12']
total_sum = total_len = 0
for row in rows:
values = map(float, row.split())
total_sum += sum(values)
total_len += len(values)
print total_sum/total_len
对于 Python 3.x,将 print avg 替换为 print(avg) 并在 map 周围添加一个 ,否则 list() len 没有为它定义。
这类似于@VadimK在his answer ,但避免了列表加法,而是只进行整数加法。
