0

我已经从 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())

filters_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 个字段都为空,则暂停该过程。并且必须是这样的结果:

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

提前感谢您的帮助。

4

2 回答 2

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')]
于 2013-03-06T06:17:34.807 回答
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')]
于 2013-03-06T07:06:55.203 回答