2016-10-12 6 views
0

Excelでは、私はこのようなものを使用することができるだろう:(、最後にあなたがAに結果を移動するユーザー塗りつぶしのこのダウンスプレッドシート、および、単にAとBは削除されます)2列を連結してPythonでcsvを更新するにはどうすればいいですか?

=CONCATENATE(A1," ",B1) 

最終結果は、A列とB列を1つの列(A)にマージし、1つのスペースで区切ることが期待されます。ここでは、Pythonで

は、私がこれまで持っているものです。

import csv 
with open("test.csv","rb") as source: 
    rdr= csv.reader(source) 
    with open("result","wb") as result: 
     wtr= csv.writer(result) 
     for r in rdr: 
      print("Adding merged COL1/COL2 into one column for every row...") 
      wtr.writerow(r+[r[0] + ' ' + r[1]]) 
      print("Deleting COL1/COL2 columns from every row...") 
      del r[0] 
      del r[0] 
      wtr.writerow(r) 
    result.close(); 

上記のコードは正常に2つの列をマージし、ファイルの末尾に列を追加しない、けれども、それが適切に最初の二つは削除されません。行が終わったら、これはwtr.writerowが既に呼び出されているためです。また、列が左端に移動する方法はわかりません(最後にAが付くので)。

答えて

0

だから、csvから読み込んだ(そして書いている)行はすべてリストですよね?だから、もう一歩踏み込んで、あなたが望むリストを作成し、それを書いてください。

import csv 
with open('test.csv') as f: 
    reader = csv.reader(f) 
    with open('output.csv', 'w') as g: 
     writer = csv.writer(g) 
     for row in reader: 
      new_row = [' '.join([row[0], row[1]])] + row[2:] 
      writer.writerow(new_row) 

また、csvからバイナリ( 'rb'、 'wb')を読み書きする必要があるかどうかは疑問です。

+0

これははるかにクリーンな解決策です、それを説明する時間を割いていただきありがとうございます。 – tonemgub

1

あなたはそのループでwriterowを2回呼び出しています。私はあなたがそれを望んでいるとは思わない - マージされた列と別の列を別々に書く?第

あなたは単に開始行のにマージされた列に参加することができ、かつスライスオフ古い行は:

wtr.writerow([r[0] + ' ' + r[1]] + r[2:]) 
#   ^<- merged rows are added to the start 
#         ^<- slice off old A1 and B1 

は、あなたはもはやdel文を必要としません。あなたはMULTを置くことができることに注意し、また

import csv 

with open("test.csv","rb") as source, open("result","wb") as result: 
    rdr = csv.reader(source) 
    wtr = csv.writer(result) 
    for r in rdr: 
     wtr.writerow([r[0] + ' ' + r[1]] + r[2:]) 

writerowへの1つの呼び出しは、あなたの変更を挿入します上記のように、withのステートメントの後の式。


最後に、ファイルを手動で閉じる必要はありません(result.close())。文脈は既にwithを管理しています。

+0

splitを使用することは良いアイデアです。close()が必要かどうかもわかりませんでした。ありがとう! – tonemgub

関連する問題