[英]Reading the CSV file and extract the desired amount of data using python
我从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')]
在此先感谢您的帮助。
您可以检查字符串列表中的所有元素是否具有零长度,方法是在它们全部连接在一起时测试它们的长度是否为零。 这似乎给你你想要的东西:
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')]
先前建议的答案的一个问题是, 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')]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.