我有大约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()
这最后一部分给出了一个错误,即无法将字符串转换为浮点数 - 回溯显示内容存在问题=([内容中的i为[float(i)])
答案 0 :(得分:0)
这是给你错误的一行:
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")