2016-05-13 11 views
0

を書きます以下のように、私は...引数で置き換えられるの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

内容は素晴らしいですが、新しいプログラマーが頭を抱くのは難しいです。それは質問が何であるかではないので、私はそれを簡単かつ明示的に保つことを選択しました。 YMMV。 – alexis

2

あなたは、リストの内包表記を使用することができます。

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

質問が正しく理解されていれば、 '' wtr.writerow(r [1]、r [3])と同じ効果を得るために、 'writerow(* [rows_to_keepのcolのためのcol])' ]、r [5]、r [6]) '"である。 – EOL

+0

@EOL:複数の引数を持つ 'writerow()'は構文エラーです。しかし、そうです、それは理解の中で 'r [col]'でなければなりません。 – 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]) 
関連する問題

 関連する問題