no-image

.csvをpythonで扱う。【退屈なことをpythonにやらせよう耐久】

全CSVファイルを取得し、先頭の行だけを削除する方法

import csv, os

csv_files = []
#カレントディレクトリのリストから.csvファイルだけを作る。
for file in os.listdir():
 if file.endswith('.csv'):
 csv_files.append(file)
 
#csv_filesをひとつずつ書き込みモードで開きcsv_readerオブジェクトを作成する。
for file in csv_files:
 read_file = open(file)
 csv_reader = csv.reader(read_file)
 output_file = open(os.path.join('csv', file), 'w', newline='')
 file_writer = csv.writer(output_file)
  for row in csv_reader:
   if csv_reader.line_num > 1: 
   file_writer.writerow(row)
 output_file.close()

プログラムコードの解説

16行目の.line_numはcsvリーダーオブジェクト専用のメソッドです。csvの行ごとに番号をもっています。int型として評価できるようです。したがって、 >1とすることで1行目はとばしていることになります。

csvリーダーオブジェクトとライターオブジェクトが近くにあってなんだか気持ち悪いコードになってしまいました。13行目のopen(os.path.join())の組み合わせはいろいろな場所で使えそうなテクニックです。このコードでは’csv’というフォルダに変数fileと同じ名前のファイルを作るという意味になります。

もう少し綺麗にかけるような気もするコードかもしれません。

退屈なことをpythonにやらせように書かれていること

書籍のテクニックとしてあげられるのは if csv_reader.line_num == 1と書いて次にcontinue文を使ってスキップしてることです。あとはcsv_rows = [ ]でからのリストを作り、append()で1から行リストを作っているところです。

上記プログラムにはそのコードはありません。

結果的にこのプログラムはよくわからずにできた感じがします。ずっと悩んでいた部分は、csv.writerオブジェクトや、open()関数の場所です。はじめのうちはopen関数を変な場所においていたのでミスをしてしまいました。forループはオブジェクトの流れが頭の中で混乱してくるので注意が必要です。

1回書き込みモードopenで開いたら、次はclose()で閉じるまでは開かないことが重要です。open()を第2ループの中に置いてしまうと悲惨な結果になります。