从行列表中删除一行

时间:2012-09-25 22:11:47

标签: python

我正在将csv读入列表,我需要在特定条件下从列表中删除整行:

import csv

thefile = []

def dowork():
    sourceFile='e.csv'
    CleanFile(sourceFile)

def CleanFile(sourceFile):
    global thefile
    thefile=list(csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"'))
    for line in thefile:
        if line[3]=='':
            #here's where i need to delete line from thefile

如何从line删除thefile

2 个答案:

答案 0 :(得分:4)

您需要line内的thefile索引。一旦你拥有了它,这很容易。你得到的方式是enumerate

def CleanFile(sourceFile):
    global thefile
    thefile=list(csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"'))
    for i, line in enumerate(thefile):
        if line[3]=='':
            del thefile[i]

然而,值得问你是否确实需要删除它。例如,您可以像这样过滤掉它吗?

def CleanFile(sourceFile):
    global thefile
    thefile=[line for line in 
             csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"')) 
             if line[3] != '']

或者,根据您对数据的处理方式,在输出或计算时间跳过line[3] == ''的行可能更有意义。或者,更好的是,不要首先列出清单;只需将csv.reader保留为迭代器,然后就可以通过itertools.ifilter或生成器表达式在它前面粘贴一个过滤器。事实上,这就像改变两个字符一样简单:

def CleanFile(sourceFile):
    global thefile
    thefile=(line for line in 
             csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"')) 
             if line[3] != '')

当然,如果您需要,例如随机访问thefile,这是没有意义的。但如果你要逐行迭代它,这可能是最好的解决方案。 (除了thefile不应该是全局的;它应该根据需要在函数之间传递。)

答案 1 :(得分:1)

尝试使用过滤器:

def CleanFile(sourceFile):
   global thefile
   thefile=list(csv.reader(open(sourceFile, 'rb'), delimiter=',', quotechar='"'))

   def f(x): return x[3] != ''
   thefile = filter(f, thefile)

   return thefile