2011-12-14 10 views
1

私はcsvを次のように記述しようとしています:data [0] [0]は1行目A、data [0] [1]は1行目Bの場合、data [1] [0]は2行目A、data [1] [1]は2列目Bなどにする必要があります。CSVの列をまたがるPythonループ

次のコードのような非効率なものを使用すると、意図したとおりにCSVに書き込むことができます。

   for i in range(0, len(data)-lg): 
        writer.writerow([data[i][0], data[i][1], data[i][2],...]) 

本当に次のコードのようなものが必要です。しかし、このコードではすべてをA列に記述していますが、目的を達成するためにはどのように変更できますか?ありがとう。

  for i in range(0, len(data)-lg): 
       for j in range(0, lg+6): 
        writer.writerow([data[i][j]]) 

答えて

4

私は(完全にあなたのlg変数を理解していない)、これを行うための慣用的な方法は以下のようなことだと思う:

num_cols = lg + 6 
for row in data: 
    writer.writerow(row[:num_cols]) 

あなたがループ内の行上の任意の処理を行っていなかった場合は、あなたも、より簡潔にそれを行うことができます:

writer.writerows(data) 

を編集1 を説明するコメントに基づいて更新変数

+0

ありがとうございます。 lgは10と30の間の数値です。len(データ)は簡単に10,000+以上にすることができます。ある意味では、lg(実際にはlg + 6)はcsvが持つ列の数です。したがって、10,000以上の行とlg + 6個の列があります。 lgはコード内の他のループと結びついているので重要です。この質問を投稿する前にDan D.のソリューションを試しましたが、データの各行が['blah'、'11/12/2011 '、6,7,8,9]のように見えるという問題があります。したがって、行がCSVに書き込まれるとき、括弧と一重引用符で1つのセルに書き込まれます。私は別々の列に書かれた各値を必要とします。そのため私はデータ[i] [j]を試しました。 – johnjdc

+0

OKだから、もし 'lg'が列の数ならば、' data'ではなく個々の 'row'でスライスしたいと思うでしょう。確認できる場合は、コードを更新します。 csvモジュールは行を適切な列に分割して処理する必要がありますが、それはあなたのために機能していないと言っているようです。私はモジュールを何度も使用していますので、おそらくあなたが提示していないコードに、おそらくライターの初期化の仕方の中に何かがあると思います。 –

+0

私はopen( 'test.csv'、 'wb')をf:とwriter = csv.writer(f)として使用しています – johnjdc

2

なぜですか?

for row in data: 
    writer.writerow(row) 
+0

です:[「何とか」、'11/2011' 分の12、6 、7,8,9]。したがって、各csv行は、1つのセルにすべて正確にその形式で移入されます。このために私が思いついたのは、リスト内の各項目を指定することでした。あなたは、行1 colA、11/12/2011行1 colBのように、より良い方法を知っていますか? – johnjdc

1

writerow()は、行(文字列または数字のシーケンス)を入力として受け取ります。 2番目のコードではwriterow()に1つの要素しか渡されないため、要素は別の行(つまり、列Aの各要素)に書き込まれます。あなたの最初の例では、データ行のコレクション全体をwriterow()に渡して正しく動作させるようにします。ダンD.が示唆したようにデータの行は次のようになりますので、より多くの神託の方法は、私はこの道を行かなかった理由がある

for x in data: 
    writer.writerow(x) 
+0

ありがとうございます。それは理にかなっている。上記のDan D.への私のコメントを見てください。 – johnjdc

+0

私はそれを完全に理解していませんでした。 csvで定義した区切り文字に応じて、リストの各要素が区切り文字で区切られた行にデータが書き込まれます(デフォルトは、)。 – RedBaron

関連する問題