2016-11-01 8 views
2

ソースCSVファイル(source.csv)を開き、最初の列名に従って複数のCSVファイルに分解しようとしています。 source.csvCSVファイルに書き込むときにPythonが自動的に次の行に移動しない

内容::私は、この例でそれを示して

2016-11,a 
2016-11,b 
2016-12,a 
2016-12,b 
2016-12,c 

を、私はプログラムが2016-11.csv2016-12.csv名前を持つ2つのファイルを作成することを期待:2016-11.csv

期待コンテンツ:

2016-11,a 
2016-11,b 

予想される内容2016-12.csv

2016-12,a 
2016-12,b 
2016-12,c 

私はこのコードを開発:

import csv 
path1='/home/sourcefilepath/' 
path2='/home/targetpath/' 
filename='source.csv' 

with open(path1+filename) as f: 
    reader = csv.reader(f) 
    for row in reader: 
     date=row[0] 
     with open(path2+date+'.csv', 'w') as csvfile: 
      writer = csv.writer(csvfile, delimiter=',') 
      writer.writerow(row) 

問題はそれだけで、各ファイルの最初の行を書き、書きながら自動的に次の行に移動しませんです。この問題を解決するにはどうすればよいですか?

+1

あなたが使用することを意味した ' 'a''の代わりに、おそらく?また、各書き込み後にファイルを開いたり閉じたりするのは少し効率が悪いので、一度に2つのファイルを開くこともできます。 – UnholySheep

+0

あなたは正しいです、単に 'w'を 'a'に変更して問題を解決してください! tnx – Woeitg

答えて

2

あなたはwフラグでそれらを開くたびに、itertools.groupbyを使用して行をグループ化することで代わりにしてみてください、あなたのファイルの内容を上書きしている:

import csv 
import itertools 

with open(path1 + filename) as f: 
    reader = csv.reader(f) 
    for date, rows in itertools.groupby(reader, lambda row: row[0]): 
     with open(path2 + date + '.csv', 'w') as csvfile: 
      writer = csv.writer(csvfile, delimiter=',') 
      writer.writerows(rows) 
+0

'w'または 'a'?多分 'a'は現在のものです – Woeitg

+1

@Woeitg 'itertools.groupby'を使うことの利点は、あなたのファイルを何度も開いたり閉じたりする必要がないことです。これは遅いですし、' writerows'も呼び出しより高速です'writerow'を数回繰り返します。 –

+0

ソースファイルが最初の列でソートされていれば、2つの答えがパフォーマンスに大きな違いはないと思います。 – Woeitg

2

前のファイルを'w'で上書きしています。ファイルを開くだけでなく、すべての繰り返しで終了することは非常に良い考えではありません。

すべての行を読み込み、グループ化基準として各行(つまり日付)の最初の項目を使用してitertools.groupbyでグループ化してください。分割後に各ファイルに書き込みます。ファイルnameが各グループのキーになります。

+0

確かに、これはパフォーマンスを改善します – Woeitg

関連する問題