我使用以下代码从特定的行和列开始从csv文件中提取数据:
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')]
先谢谢你的帮助。
答案 0 :(得分: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')]
答案 1 :(得分:1)
之前建议的答案的一个问题是,在最常见的情况下,测试if len(''.join(x)) == 0:
会做很多工作来连接字符串,并且仅针对终止案例进行少量工作,字符串是空的。
最好安排一些事情为最常见的情况做一些工作,其中元组的第一个字符串不为空,或者第二个字符串不为空,或者第三个字符串不为空。这可以使用内置函数any()
进行测试,它会在找到非空字符串后立即进行短路(退出测试),因此它可以减少工作量并且启动代码更清晰。 / p>
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')]