【问题标题】:Take column average of one file, repeat for all .txt files, write all averages to one file in python取一个文件的列平均值,对所有 .txt 文件重复,将所有平均值写入 python 中的一个文件
【发布时间】:2014-05-07 20:36:36
【问题描述】:

我有大约 40 个 *.txt 文件,它们都包含两列数据 - 它们已从以前的脚本转换为 str 格式,并以空格分隔。我想为每个 .txt 文件取第二列的平均值,然后将所有平均值放入一个输出文件中。它们还需要按数字顺序读取,例如file1.txt、file2.txt。

目前我有以下脚本 a) 读取所有 .txt 文件的最后一行和 b) 取一个文件的平均值,但是当我尝试将它们组合起来时,我要么得到一个错误提示无法将字符串转换为浮点数或列表索引超出范围。我也试过用line.strip()方法确认.txt文件中没有空行来解决后一个问题,无济于事。

a) 读取所有 .txt 文件最后一行的代码:

import sys
import os
import re
import glob

numbers = re.compile(r'(\d+)')
def numericalSort(value):
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts

list_of_files = glob.glob("./*.txt")

for file in sorted(list_of_files, key=numericalSort):
    infiles =  open(file, "r")

    outfile = open("t-range","a")

    contents = [""]
    columns = []

   counter = 0

   for line in infiles:
        counter += 1
        contents.append(line)

    for line in contents:
        if line.startswith("20000"):
            columns.append(float(line.split()[1]))
            print columns

    counter1 = 0
    for line in columns:
        counter1 += 1
      outfile.write(','.join(map(str,columns))+"\n")

infiles.close()
outfile.close()

b) 取一个文件的平均值的脚本:

data = open("file.txt","r").read().split()
s = sum ([float(i) for i in data])
average = s / len(data)

c) 组合脚本

import sys
import os
import re
import glob

numbers = re.compile(r'(\d+)')
def numericalSort(value):
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts

list_of_files = glob.glob("./totalenergies*")

for file in sorted(list_of_files, key=numericalSort):
    infiles =  open(file, "r")
    outfile = open("t-range","a")

    contents = [""]
    columns = []

    counter = 0

    for line in infiles:
        counter += 1
        contents.append(float(line.split()[1]))

        contents = ([float(i) for i  in contents])
        s = sum(contents)
        average = s / len(contents)
        columns.append(average)

        counter1 = 0
        for line in columns:
            counter1 += 1
            outfile.write("\n".join(map(str,columns)) + "\n")


infiles.close()
outfile.close()

最后一部分给出了一个错误,即无法将字符串转换为浮点数 - 回溯显示内容存在问题 = ([float(i) for i in contents])

【问题讨论】:

    标签: python string average multiple-columns glob


    【解决方案1】:

    这是给您错误的行:

    outfile.write("".join(map(str,columns)+"\n"))
    

    当您阅读 Traceback 错误时,最后一部分通常会向您显示脚本中产生问题的行号,因此您应该先检查一下。

    该行当前读取的方式,+"\n"join 函数的一部分,而它应该是 write 方法的一部分:

    outfile.write("".join(map(str,columns)) + "\n")
    

    如果您的意图是将columns 中的每个平均值写在一个新行上,并在列表末尾插入一个新行,您需要这样:

    outfile.write("\n".join(map(str,columns)) + "\n")
    

    更多:http://docs.python.org/2/library/stdtypes.html#str.join

    【讨论】:

    • 谢谢!虽然回溯错误是因为我需要将 contents = ([float(str(i)) for i in contents])
    猜你喜欢
    • 2020-02-19
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2018-09-15
    • 2023-04-07
    • 2015-06-11
    相关资源
    最近更新 更多