PythonでCSVデータを読んでみた

Python3でCSVのデータの読み込みと出力をしてみました。

目次

  1. csvライブラリ
  2. 試してみた

csvライブラリ

Pythonの標準ライブラリのcsvライブラリを使って読み書きしてみました。

Excelを使うことが多いので、基本的にはExcelから出力されたCSVファイルを扱うことが多いのですが、たまに手打ちでCSVファイルを書いたりします。そういうときに、私にとっての可読性を良くするために、カンマの後ろにスペースを入れたりします。

readerにdialectをexcelと指定するとExcel様式として読み込んでくれるのですが、残念なことにこの様式ですとカンマの後ろのスペースを無視してくれません。規約としてはそれが正しいのですが、いちいち後からスペースを取り除くのも面倒です。

そこで、csv.excelクラスを継承したクラスを作って、スペースを無視してもらうようにしてみました。

試してみた

コードを見るのが手っ取り早いと思います。

どういうものを作ったかというと、

  1. csvライブラリをインポート。

  2. csv.excelクラスを継承したクラスを作成。

  3. 作ったクラスをcsv.register_dialectでDialectとして登録。

  4. CSVファイルの読み込み。

  5. データの加工。

  6. ファイルに出力。

データの加工は、行の最初のフィールドと2つ目以降の各フィールドとのペアに変換するという、あまりしない操作です。

コード

import csv

class MyCSV(csv.excel):
    skipinitialspace = True

csv.register_dialect('myCSV', MyCSV)

# 読み込み
readdata = []
with open('csvtest.csv', newline='') as f:
    reader = csv.reader(f, dialect='myCSV')
    for row in reader:
        readdata.append(row)

print('読み込んだデータ')
print(readdata)
print('')

outdata = []
for row in readdata:
    c = 1
    while c < len(row):
        d = []
        d.append(row[0])
        d.append(row[c])
        outdata.append(d)
        c = c + 1

# 書き込み
with open('csvout.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(outdata)

結果

入力したCSVファイルはこんな感じです。

# 列A,列B,列C,
1, 3, 5,
"ちゅう","ちゅう","たこ
かい","な"
Yes, we, can,

フィールドの数がそろってなかったり、フィールドの中に改行があったり、ダブルクォーテーションが付いていたりいなかったり、嫌らしいデータですね。

プログラムを実行した際の出力はこうなりました。

C:\>python csvtest.py
読み込んだデータ
[['# 列A', '列B', '列C', ''], ['1', '3', '5', ''], ['ちゅう', 'ちゅう', 'たこ\r\nかい', 'な'], ['Yes', 'we', 'can', '']]

ちゃんと読み込んでますね。 出力されたCSVファイルはこんな感じです。

# 列A,列B
# 列A,列C
# 列A,
1,3
1,5
1,
ちゅう,ちゅう
ちゅう,"たこ
かい"
ちゅう,な
Yes,we
Yes,can
Yes,

きちんと出力されました。

公開日

広告