我对python(这是我所知道的唯一编程语言)有点新鲜,而且我有一堆光谱数据保存为.txt文件,其中每一行都是一个数据点,第一个数字是由标签使用和分离的光的波长,第二个数字是仪器信号/对该波长的光的响应。
我希望能够获取文件夹中的所有数据文件,并打印一个文件,该文件是每个波长光的所有信号/响应列条目的平均值(它们都包含来自350的响应数据) -2500nm光)。有没有办法做到这一点?如果不是因为我需要将103个光谱平均在一起,我只是手工完成,但是....
编辑:我意识到我的措辞非常糟糕。我现在意识到我可能只是使用os来访问给定文件夹中的所有文件。问题是我想平均每个波长的信号值。即,我想读取文件夹中的所有数据,并获得350nm,351nm等信号/响应的平均值。 我想这是我可以用循环做的事情,一旦我将所有文件读入python,但我不是100%肯定。我也犹豫不决,因为我担心这会让节目变得很慢。答案 0 :(得分:1)
这样的事情(假设所有txt文件格式相同,并且所有文件都具有相同的波长值范围)
import os
import numpy as np
dat_dir = '/my/dat/dir'
fnames = [ os.path.join(x,dat_dir) for x in os.listdir(dat_dir) if x.endswith('.txt') ]
data = [ np.loadtxt( f) for f in fnames ]
xvals = data[0][:,0] #wavelengths, should be the same in each file
yvals = [ d[:,1] for d in data ] #measurement
y_mean = np.mean(yvals, axis=0 )
np.savetxt( 'spectral_ave.txt', zip(xvals, y_mean) , fmt='%.4f') # something like that
答案 1 :(得分:0)
import os
dir = "./" # Your directory
lengths = 0
responses = 0
total = 0
for x in os.listdir(dir):
# Check if x has *.txt extension.
if os.path.splitext(x)[1]!=".txt": continue
fullname = os.path.join(dir, x)
# We don't want directories ending with *.txt to mess up our program (although in your case this is very unlikely)
if os.path.isdir(fullpath): continue
# Now open and read the file as binary
file = open(fullname, "rb")
content = file.read()
file.close()
# Take two entries:
content = content.split()
l = float(content[0])
r = float(content[1])
lengths += l; responses += r
total += 1
print "Avg of lengths:", lengths/total
print "Avg of responses:", responses/total
如果您希望它进入子目录,请将其置于函数中并在os.path.isdir(fullname)为True时使其递归。
虽然我给你写了代码,但不是那样的。请记住,在下一个问题中。
答案 2 :(得分:0)
如果除了Windows以外的其他任何东西,通常的方法是编写一个python程序来处理你在命令行上放置的所有文件。然后,您可以在results/*
上运行它来处理所有内容,或者只处理单个文件,或者只处理几个文件。
这将是更多的Unix方式。有许多 unix程序可以处理多个输入文件(cat
,sort
,awk
等),但大多数都将目录遍历到贝壳。
http://www.diveintopython.net/scripts_and_streams/command_line_arguments.html有一些关于程序的命令行args的例子。
import sys
for arg in sys.argv[1:]: # argv[0] is the script's name; skip it
# print arg
sum_file(arg) # or put the code inline here, so you don't need global variables to keep state between calls.
print "totals ..."