#python #matplotlib #spyder #python-2.x
#python #matplotlib #spyder #python-2.x
Вопрос:
Я написал функцию для обработки данных, и мне нужно применить ее к большому количеству файлов в каталоге.
Функция работает при применении к отдельным файлам.
def getfwhm(x):
import numpy as np
st=np.std(x[:,7])
fwhm=2*np.sqrt(2*np.log(2))*st
file=open('all_fwhm2.txt', 'at')
file.write("fwhm = %.6fn" % (fwhm))
file.close()
file=open('all_fwhm2.txt', 'rt')
print file.read()
file.close()
Теперь я хочу использовать это в большем масштабе. До сих пор я написал этот код
import os
import fwhmfunction
files=os.listdir(".")
fwhmfunction.getfwhm(files)
Но я получаю следующую ошибку
File "fwhmfunction.py", line 11, in getfwhm
st=np.std(x[:,7])
TypeError: list indices must be integers, not tuple
Я пишу на python, используя spyder.
Спасибо за вашу помощь!
Ответ №1:
В духе unix вы должны разделить программу на две:
- программа, которая работает с данным файлом
- программа, которая применяет данный скрипт к заданному списку файлов (глобус или что-то еще)
Итак, вот пример 1:
# name: script.py
import sys
File = sys.argv[1]
# do something here
print File
(лучше использовать argparse
для анализа аргументов, но мы использовали argv
его для упрощения)
Что касается второй части, уже есть отличный инструмент unix:
$ find . -maxdepth 1 -mindepth 1 -name "*.txt" | parallel python2.7 script.py {}
Здесь вы получаете дополнительный бонус: параллельное выполнение задачи.
Если вы на Windows, то вы можете написать что-то простое (последовательное) на python:
# name: apply_script_to_glob.py
import sys, os
from glob import glob
Script = sys.argv[1]
Glob = sys.argv[2]
Files = glob(Glob)
for File in Files:
os.system("python2.7 " Script " " File)
(опять же, мы ничего не использовали argparse
и не проверяли, чтобы упростить его). Вы бы вызвали скрипт с
$ python2.7 apply_script_to_glob.py "script.py" "*.txt"