簡體   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