2017-03-22 15 views
0

は、私は、テキストファイルの各行を操作セロリスクリプトを書いたこのCeleryは実際にどのようにタスクを実行しますか?

aaaaabbbb cccc--ddddeee ffff 
gggjjjkkk eers--kklliii kkll 
... 

のようないくつかの行が含まれているディレクトリthe_files内のテキストファイルを持っています。

from celery import Celery 

import os 

app = Celery('tasks', broker='amqp://[email protected]//') 

path = "the_files/" 

@app.task 
def do_task_txt(): 
    dir_path = os.listdir(path) 
    for file in dir_path: 
     if file.endswith(".txt"): 
      f = open(path + file, "r") 
      for line in f: 
       string1 = line[0:14].replace(" ", "") 
       string2 = line[16:].replace(" ", "") 

      #print string1, string2 
      return string1, string2 
     f.close() 

私はセロリと、このスクリプトを実行すると、それはそれは最初の行のみを示した以下の結果

[tasks] 
    . tasks.do_task_txt 

[2017-03-22 13:51:00,713: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672// 
[2017-03-22 13:51:00,791: INFO/MainProcess] mingle: searching for neighbors 
[2017-03-22 13:51:01,966: INFO/MainProcess] mingle: all alone 
[2017-03-22 13:51:02,055: INFO/MainProcess] [email protected] ready. 
[2017-03-22 13:51:25,624: INFO/MainProcess] Received task: tasks.do_task_txt[77166520-21a8-466e-9522-cb2b1821a185] 
[2017-03-22 13:51:26,152: INFO/PoolWorker-2] Task tasks.do_task_txt[77166520-21a8-466e-9522-cb2b1821a185] succeeded in 0.00866508999752s: ('aaaaabbbbcccc', 'ddddeeeffff') 

を提供します。

私はこれをおそらくすべての行に表示することを望んでいましたか?

[2017-03-22 13:51:26,152: INFO/PoolWorker-2] Task tasks.do_task_txt[77166520-21a8-466e-9522-cb2b1821a185] succeeded in 0.00866508999752s: ('aaaaabbbbcccc', 'ddddeeeffff'),('gggjjjkkkeers', 'kklliiikkll'),(.....,...) 

私はprint string1, string2を呼び出すことによって、私のスクリプトをチェックし、それは私がこの

aaaaabbbbcccc ddddeeeffff 
gggjjjkkkeers kklliiikkll 
... 

のように期待したものとして結果を印刷する私の質問はどのようにセロリがタスクを実行しないされましたか? do_task_txtというタスクを実行すると、操作されたファイルから1行だけが表示されます。 1行だけではなく、操作された行をすべて表示するにはどうすればよいですか?

ありがとうございます。

答えて

0

最初のf.close()は、if文の内部では呼び出されないので、ファイルハンドルはそのまま残ります。

セカンドタスクは、セロリ(またはブローカ)が正しく解析しないタプルを返します。代わりに

戻り、マージされた文字列:あなたreturn、機能の実行が終了すると

return ", ".join(string1, string2) 
0

、それは左線や他のファイルを処理しません。あなたは結果を保存し、最終的に戻るべきです。

@app.task 
def do_task_txt(): 
    dir_path = os.listdir(path) 
    result = [] 
    for file in dir_path: 
     if file.endswith(".txt"): 
      f = open(path + file, "r") 
      for line in f: 
       string1 = line[0:14].replace(" ", "") 
       string2 = line[16:].replace(" ", "") 

      #print string1, string2 
      result += [string1, string2] 
     f.close() 

    return result 
関連する問題