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" и для чего он нужен?