2017-03-22 90 views
0

我有目录里面the_files一个文本文件,其中包含几个行这样芹菜如何实际执行任务?

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

我写的操作在文本文件中的每一行芹菜脚本。

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时,它只显示已被操作的文件中的一行。我如何显示所有被操作的行而不是一行?

谢谢您的建议。

回答

0

第一f.close()不会被调用时,if语句里面,所以文件句柄将保持不变。

其次你的任务返回其芹菜(或经纪人)不正确地分析一个元组。

返回合并字符串,而不是:

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

当你return,函数执行完毕,也不会留下加工线和其他文件。你应该保存结果并最终返回。

@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