试着编写python CSV提取器

时间:2012-03-22 16:26:48

标签: python csv logging

我是编程的新手,这是我第一次尝试写的真正的程序。

所以我有这个巨大的CSV文件(数百个cols和数千行),我试图根据字段中的值提取少量列。它工作正常,我得到了很好的输出,但当我尝试在函数中封装相同的逻辑时出现问题。 它只返回第一个提取的行,但打印工作正常。

我已经玩了好几个小时,并在这里阅读其他例子,现在我的脑海里浮现。

import csv
import sys

newlogfile = csv.reader(open(sys.argv[1], 'rb'))
outLog = csv.writer(open('extracted.csv', 'w'))

def rowExtractor(logfile):
    for row in logfile:
        if row[32] == 'No':
            a = []
            a.append(row[44])
            a.append(row[58])
            a.append(row[83])
            a.append(row[32])
            return a

outLog.writerow(rowExtractor(newlogfile))

2 个答案:

答案 0 :(得分:1)

你过早退出。当您将return a置于for循环内时,将在第一次迭代时调用return。这意味着只有第一次迭代运行。

这样做的一个简单方法是:

def rowExtractor(logfile):
    #output holds all of the rows
    ouput = []
    for row in logfile:
        if row[32] == 'No':
            a = []
            a.append(row[44])
            a.append(row[58])
            a.append(row[83])
            a.append(row[32])
            output.append(a)
    #notice that the return statement is outside of the for-loop
    return output
outLog.writerows(rowExtractor(newlogfile))

您还可以考虑使用yield

答案 1 :(得分:1)

你的函数中有一个return语句......当它到达那一行时,它将返回(从而终止你的循环)。您需要yield代替。

请参阅What does the "yield" keyword do in Python?