【问题标题】:Read numbers from many text files and average them Python从许多文本文件中读取数字并将它们平均 Python
【发布时间】:2017-03-08 23:23:38
【问题描述】:

我刚刚开始使用 python,我有大约 6000 个 .txt 文件,每个文件在一个列中包含几个数字:

file1.txt:

2

43

78

file2.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

我得到错误:

float() 的文字无效

【问题讨论】:

  • 请贴出代码和错误详情
  • 字符串不是你需要运行它们的数字(而不是它们的长度,这是一个奇怪的选择)到float()
  • @Iabmat:您需要每个文件或所有文件的平均值吗?
  • 您好@labmat,您需要创建一个文件夹,将所有文件放在该文件夹中,您需要尝试在 python 中编写脚本来读取文件,然后您可以找到平均值,这是我非常基本的方法解释说可以有更多的方法来完成这项任务,有些方法可能会更好和更有效,只需先尝试并发布一些您与他人一起尝试过的代码将帮助您进一步完成任务
  • @Pavneet Singh 发布

标签: python average mean


【解决方案1】:

sum("abc") 未定义。 sum("2, 43") 也不是。 sum 仅适用于数字类型。

您需要先拆分行并将值转换为数值(我在这里使用float,因为那时sum将是float,因此无需转换lenfloat):

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

这类似于@VadimKhis answer 中的功能,但避免了列表加法,而是只进行整数加法。

【讨论】:

  • 这对我的测试和实际数据都有效!非常感谢:)
【解决方案2】:

使用列表推导的简单方法:

>>> my_list = ['2, 43, 78', '98, 12']
>>> my_nums = [float(j) for i in my_list for j in i.split(', ')] 
>>> avg = sum(my_nums)/float(len(my_nums))
>>> avg
46.6

【讨论】:

  • 谢谢你!当我按照您发布的内容尝试此操作时,我得到了正确的答案,但是根据我的数据,我得到: float() 的无效文字
【解决方案3】:

我认为在读取文件后映射数字可能会更好:

total_list = []
for file in files:
    str_list = file.read().splitlines() # ['1', '2', '3', '4', '5', '6']
    int_list = map(int, str_list) # [1, 2, 3, 4, 5, 6]
    total_list += int_list
ave = sum(total_list) / float(len(total_list))

【讨论】:

    【解决方案4】:

    linux下使用glob的简单方法

    import glob
    tot_list=[]
    for i in glob.glob('*.txt'):        #Return a list of .txt files in current directory
    #    print('file:', i)
        with open(i) as f:              #Open file, read lines
            lines = f.readlines()
            for x in lines:             # process each line
                try:
                    x=int(x)            #Test for integer value
                    tot_list.append(x)  #Include in list
                except:
                    pass
    print('Total:',sum(tot_list),'No of Items:',len(tot_list))
    print('Mean : %.2f' % (sum(tot_list)*1.0/len(tot_list))) #Print floating point result to 2 decimal places
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      相关资源
      最近更新 更多