2013-03-06 127 views
0

我已提取从csv文件中的数据,使用该代码从特定的行和列开始提取数据所需量:读CSV文件,使用Python

def csvread(csvpath, filtered_dict): 
    rdr = csv.reader(open(csvpath, 'rb')) 
    columns = [{key:row[pos[0][1]] for key,pos in filtered_dict.items()} for row in rdr] 
    # finally trim to desired row startpoints: 
    data = {key:[col[key] for col in columns[pos[0][0]:]] for key,pos in filtered_dict.items()} 
    return zip(*data.values()) 

filtered_dict似乎是这样的:

{'Date': [(21, 5)], 'Rate': [(21, 4)], 'Item': [(21, 2)]} 

但它提取数据直到csv文件的末尾,这会导致处理所需数据的问题。像这样:

[('Dates', 'Rates', 'Items'), 
('2013/03/07', '$114', 'Tissot'), 
('2013/03/07', '$140', 'Adidas'), 
('2013/03/07', '$344', 'Nike'), 
('', '', ''), 
('', '', ''), 
('','The rate for EVERY item is FIXED', 'No RETURN or EXCHANGE!')] 

现在我想要的是如果函数找到所有3个字段EMPTY,则暂停该进程。 ,而且必须保证这样的:提前为帮助

[('Dates', 'Rates', 'Items'), 
('2013/03/07', '$114', 'Tissot'), 
('2013/03/07', '$140', 'Adidas'), 
('2013/03/07', '$344', 'Nike')] 

感谢。

回答

1

您可以通过测试它们全部连接在一起时的长度是否为零来检查字符串列表中的所有元素是否都具有零长度。这似乎给你想要的东西:

di = [('Dates', 'Rates', 'Items'), 
     ('2013/03/07', '$114', 'Tissot'), 
     ('2013/03/07', '$140', 'Adidas'), 
     ('2013/03/07', '$344', 'Nike'), 
     ('', '', ''), 
     ('', '', ''), 
     ('','The rate for EVERY item is FIXED', 'No RETURN or EXCHANGE!')] 

d2 = [] 
for x in di: 
    if len(''.join(x)) == 0: 
     break 
    else: 
     d2.append(x) 

print (d2) 

...它输出:

[('Dates', 'Rates', 'Items'), ('2013/03/07', '$114', 'Tissot'), ('2013/03/07', ' 
$140', 'Adidas'), ('2013/03/07', '$344', 'Nike')] 
+0

见一个更好的解决方案,它使用对方的回答'任何()'不是字符串的加入。我的测试表明,使用'any()'的代码比使用join()代码实现上述测试用例的代码少40%。 – Simon 2013-03-06 19:17:58

1

,与前面建议的回答的一个问题是,在最常见的情况下,测试if len(''.join(x)) == 0:做了很多工作加入了字符串,并且只为终止的情况做了少量的工作,所有的字符串都是空的。

最好为最常见的情况安排一些工作,其中元组的第一个字符串不是空的,或者第二个不是空的,或者第三个不是空的。这可以使用内建函数any()进行测试,一找到非空的字符串就立即进行短路(退出测试),因此它的工作量更少,代码更简洁。

di = [('Dates', 'Rates', 'Items'), 
     ('2013/03/07', '$114', 'Tissot'), 
     ('2013/03/07', '$140', 'Adidas'), 
     ('2013/03/07', '$344', 'Nike'), 
     ('', '', ''), 
     ('', '', ''), 
     ('','The rate for EVERY item is FIXED', 'No RETURN or EXCHANGE!')] 

d2 = [] 
for x in di: 
    if any(x): 
     d2.append(x) 
    else: 
     break 

print (d2) 

输出:

[('Dates', 'Rates', 'Items'), 
('2013/03/07', '$114', 'Tissot'), 
('2013/03/07', '$140', 'Adidas'), 
('2013/03/07', '$344', 'Nike')] 
+0

+1:一个更好的解决方案,我现在试着记住! – Simon 2013-03-06 19:09:18