读取CSV文件并使用python提取所需的数据量

时间:2013-03-06 06:00:02

标签: python csv

我使用以下代码从特定的行和列开始从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')]

先谢谢你的帮助。

2 个答案:

答案 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')]