Python问题与threading.timer / for循环

时间:2014-09-24 06:51:49

标签: python for-loop timer enumerate

已经围绕这段代码转了一圈,可以用一只手。 这可能是我错过的地方。

我有一个CSV文件,我试图撬开某些值,为了我们的目的,它看起来像这样:

columns : A, B, C, D
row[0]: bad, x, y, s
row[1]: good1, x, y, z
row[2]: good2, x, y, z

我的代码部分如下所示:

def match_file():
    global name,
    aziVal1 = 'z'
    with open(path_address, 'rb') as userdataCSV:
        reader = csv.reader(userdataCSV)
        for row in reader:
            for (i,v) in enumerate(row):
                if aziVal1 in row:  
                    columns[i].append(v)
        name = columns[0]
        print name
    return 

如果我从终端一次运行一个代码,它可以正常工作并输出

['good1', 'good2']

但是当我尝试使用threading.Timer自动执行此操作时,

def altogether():
    threading.Timer(3.0, altogether).start()
    match_file()
    return 

这将成为输出

['good1', 'good2']
['good1', 'good2', 'good1', 'good2']
['good1', 'good2', 'good1', 'good2', 'good1', 'good2']
['good1', 'good2', 'good1', 'good2', 'good1', 'good2', 'good1', 'good2']

我真的不知道它有什么问题。我已经尝试删除全局变量,但我需要另一个函数,也尝试转移缩进无济于事。真的可以在这附近用手。谢谢!

2 个答案:

答案 0 :(得分:0)

尝试在每个循环的开头重置列。

def match_file():
    global name,
    aziVal1 = 'z'
    columns = []
    with open(path_address, 'rb') as userdataCSV:
        reader = csv.reader(userdataCSV)
        for row in reader:
            for (i,v) in enumerate(row):
                if aziVal1 in row:  
                    columns[i].append(v)
        name = columns[0]
        print name
    return

答案 1 :(得分:0)

我认为这是因为:

def altogether():
    threading.Timer(3.0, altogether).start() # You're passing this same methode into the timer.
    match_file()
    return 

当你完全调用这个方法时,用其他词语。你启动一个Timer,它也启动这个方法,启动一个新的Timer。等等。 你应该这样做:

def altogether():
    threading.Timer(3.0, match_file).start() # Passing match_file into the timer
    return 

OR:

threading.Timer(3.0, altogether).start() # Initialize outside the methode.
def altogether():
    match_file()
    return