2013-03-06 145 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