Python - обработка всех файлов в определенной папке

Я немного новичок в Python (это единственный язык программирования, который я знаю), и у меня есть куча спектральных данных, сохраненных в виде файлов.txt, где каждая строка - это точка данных, первое число - длина волны света используется и разделен знаком табуляции, второе число - это сигнал / реакция прибора на эту длину волны света.

Я хочу иметь возможность взять все файлы данных, которые у меня есть в папке, и распечатать файл, который является средним значением всех записей столбца сигнал / ответ для каждой длины волны света (все они содержат данные для ответов от света 350-2500 нм). Есть какой-либо способ сделать это? Если бы не тот факт, что мне нужно усреднить вместе 103 спектра, я бы просто сделал это вручную, но...

РЕДАКТИРОВАТЬ: Я понимаю, что я сказал это ужасно. Теперь я понимаю, что могу, вероятно, просто использовать OS для доступа ко всем файлам в данной папке. Дело в том, что я хочу усреднить значения сигнала для каждой длины волны. Т.е. я хочу прочитать все данные из папки и получить среднее значение для сигнала / ответа в 350 нм, 351 нм и т. Д. Я думаю, что это можно сделать с помощью цикла, как только я получу все файлы, считанные в python, но я не уверен на 100%. Я также колеблюсь, потому что я волнуюсь, что это сильно замедлит программу.

3 ответа

Примерно так (при условии, что все ваши текстовые файлы отформатированы одинаково, и что все файлы имеют одинаковый диапазон значений длины волны)

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
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(полное имя) равно True.

Хотя я написал вам код, так что не для этого. Помните об этом в вашем следующем вопросе.

Если вы работаете не с Windows, то обычным способом сделать это будет написать программу на Python, которая обрабатывает все файлы, которые вы помещаете в командную строку. Тогда вы можете запустить его на results/* обрабатывать все, или только на одном файле, или только на нескольких файлах.

Это был бы более Unixy способ идти о вещах. Есть много программ Unix, которые могут обрабатывать несколько входных файлов (cat, sort, awkи т. д.), но большинство из них оставляют обход каталога в оболочке.

http://www.diveintopython.net/scripts_and_streams/command_line_arguments.html содержит несколько примеров получения аргументов командной строки для вашей программы.

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

Смотрите также этот вопрос: что такое "argv" и для чего он нужен?

Другие вопросы по тегам