Python - 处理特定文件夹中的所有文件

时间:2015-07-20 03:45:40

标签: python file directory text-processing data-processing

我对python(这是我所知道的唯一编程语言)有点新鲜,而且我有一堆光谱数据保存为.txt文件,其中每一行都是一个数据点,第一个数字是由标签使用和分离的光的波长,第二个数字是仪器信号/对该波长的光的响应。

我希望能够获取文件夹中的所有数据文件,并打印一个文件,该文件是每个波长光的所有信号/响应列条目的平均值(它们都包含来自350的响应数据) -2500nm光)。有没有办法做到这一点?如果不是因为我需要将103个光谱平均在一起,我只是手工完成,但是....

编辑:我意识到我的措辞非常糟糕。我现在意识到我可能只是使用os来访问给定文件夹中的所有文件。问题是我想平均每个波长的信号值。即,我想读取文件夹中的所有数据,并获得350nm,351nm等信号/响应的平均值。 我想这是我可以用循环做的事情,一旦我将所有文件读入python,但我不是100%肯定。我也犹豫不决,因为我担心这会让节目变得很慢。

3 个答案:

答案 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程序可以处理多个输入文件(catsortawk等),但大多数都将目录遍历到贝壳。

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

另请参阅此问题:What is "argv", and what does it do?