2013-02-21 3 views
0

У меня есть скрипт python, который принимает некоторые параметры, и я хочу запустить этот скрипт во всех подкаталогах, начиная с того, в котором находится скрипт.Запустить скрипт python во всех подкаталогах с определенным именем

Идея заключается в том, что я хочу, чтобы пользовательский вывод скрипта сохранялся в файле.

вот что я сделал:

for x in `find . -type d | grep data`; 
do 
python /full/path/to/file/script.py -f "%a 
%t" $x/*.txt -o $x/res.txt 
done 

Но это не работает, и я не знаю, почему. grep в цикле for должен только получить каталоги, содержащие файлы .txt, и применить к ним скрипт.

Новая линия между% а и% т, потому что я хочу, чтобы настроить вывод на выходе из сценария питона, чтобы включить новую строку между каждым 2-х переменными

Что я делаю неправильно?

+0

Не могли бы вы уточнить? Вы хотите запустить скрипт python во всех подкаталогах каталога, в котором он находится? Или вы хотите запустить его в общем случае на любые файлы, переданные ему? Это первый, тогда «os.walk» будет лучшим способом сделать это, передав все эти файлы. – will

+0

Вы говорите, что ваш скрипт не работает. Каков результат и как он отличается от ожидаемого результата? – imp25

+0

@will Я хочу запустить скрипт во всех подкаталогах каталога, в котором он находится .., которые соответствуют только имени каталога «data» – ifreak

ответ

0

Если вы хотите запустить этот сценарий на всех вложенных каталогов, начиная с той, что сценарий находится внутри, а затем попытаться сделать это таким образом, вместо этого:

import os 

for path, directories, files in os.walk(os.path.dirname(os.path.realpath(__file__))): 
    print path, directories, files 
    txt_files = [arbitrary_file for arbitrary_file in files if arbitrary_file[-4:].lower() == ".txt"] 

    #run your python here 
    txt_files = [txt_file for arbitrary_file in files if arbitrary_file[] 

Если исходный код был такой:

import sys 

text_files_to_process = #Do Something with sys.argv - or whatever you're using to parse your arguments. 

with open("res.txt", "w") as f: 
    #do something with all the text files, and write the output to res.txt. 
    for text_file in text_files_to_process: 
     with open(text_file) as tf: 
      for line in tf: 
       #whatever your text processing is 
      tf.write("something") 

тогда вы просто изменить его на что-то вроде этого:

import os 

for path, directories, files in os.walk(os.path.dirname(os.path.realpath(__file__))): 
    print path, directories, files 
    txt_files = [arbitrary_file for arbitrary_file in files if arbitrary_file[-4:].lower() == ".txt"] 

    txt_files = [txt_file for arbitrary_file in files if arbitrary_file[] 

    with open("res.txt", "w") as f: 
     #do something with all the text files, and write the output to res.txt. 
     for text_file in txt_files: 
      with open(text_file) as tf: 
       for line in tf: 
        #whatever your text processing is 
       tf.write("something") 
+0

, скрипт будет вычислять результат для всех файлов .txt внутри каждого суб- каталог (данные) не для каждого txt-файла – ifreak

+0

Да, я понял это. Ваша программа принимает список текстовых файлов для каждого подкаталога. Это список 'txt_files'. Он будет перезаписан для каждого нового подкаталога 'os.walk'. – will

+0

где мой вызов python становится в этом случае .. и как я могу дать ему параметр в виде списка? – ifreak