繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM