2016-05-13 69 views
0

我試圖建立一個動態刪除,並根據它在傳遞列號命令行功能到目前爲止,我已經定義如下:動態參數

import csv 

def delete(rows_to_keep): 
    with open('file.csv','r') as source: 
     rdr= csv.reader(source) 
     with open('reordered.csv','w') as result: 
      wtr= csv.writer(result, delimiter=',', lineterminator='\n') 
      for r in rdr: 
       wtr.writerow(...) 

rows_to_keep = [1, 3, 5, 6] 

delete(rows_to_keep) 

然而,在以上,我想在各writerow(...)以由自變量被替換如下:

... = r[1], r[3], r[5], r[6] 

wtr.writerow(r[1], r[3], r[5], r[6]) 

並且具有參數數量和順序變化取決於通過什麼。

我不太確定如果突然數組有10個值,我可以做到這一點。有任何想法嗎??

回答

2

在一個循環中使用rows_to_keep來創建一個列表與您要寫出的新值序列。然後將該列表傳遞給writerow();它不接受任意數量的參數,所以你必須用一種或另一種方式用列表來調用它。類似這樣的:

rows_to_keep = [1, 3, 5, 6] 
... 
for row in rdr: 
    newrow = list() 
    for n in rows_to_keep: 
     newrow.append(row[n]) 
    wtr.writerow(newrow) 

PS。或者如果您願意,可以使用理解。相同的結果(如果使用正確)。

for row in rdr: 
    newrow = [row[n] for n in rows_to_keep] 
    wrt.writerow(newrow) 
+0

完美謝謝! – NickP

+0

我會一直使用列表理解:這是他們的目的。而且,在第一個例子中,'list()'通常會簡單地寫成'[]'。 – EOL

+0

理解力非常好,但對於新程序員來說,他們很難將其包圍。由於這不是問題的關鍵,我選擇保持簡單和明確。因人而異。 – alexis

2

您可以使用列表理解:

wtr.writerow([r[col] for col in rows_to_keep]) 
+0

如果我正確地理解了這個問題,'writerow(* [r [col] for col in rows_to_keep])'實際上是合適的,以便與「'wtr.writerow(r [1],r [3 ],r [5],r [6])'「。 – EOL

+0

不完全相同,@EOL:具有多個參數的'writerow()'是一個語法錯誤。但是,是的,這應該是理解中的。 – alexis

+0

對不起,已更新。 –

1

也許你的意思是columns_to_keep並通過列的列表,以保持作爲一個列表的功能。您可以在這裏使用operator.itemgetter

import csv 
import operator 

def prune_columns(columns_to_keep): 
    with open('file.csv', 'r') as source,\ 
     open('reordered.csv','w') as result: 
     rdr = csv.reader(source) 
     wtr = csv.writer(result, delimiter=',', lineterminator='\n') 

     select = operator.itemgetter(*columns_to_keep) 
     # select is now a function that returns a tuple that 
     # returns elements 1, 3, 5 and 6 of the input 

     for row in rdr: 
      wtr.writerow(select(row)) 

prune_columns(columns_to_keep=[1, 3, 5, 6])