Применить функцию ко всем файлам в каталоге

#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. программа, которая работает с данным файлом
  2. программа, которая применяет данный скрипт к заданному списку файлов (глобус или что-то еще)

Итак, вот пример 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"