0

我正在将 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

4

2 回答 2

4

line您需要within的索引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不应该是全局的;它应该根据需要从一个函数传递到另一个函数。)

于 2012-09-25T22:14:04.567 回答
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
于 2012-09-25T22:18:27.557 回答