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