PythonでCSVを読み書きする方法!(reader/writer)

Python Python

PythonでCSVを読み込んだり、書いたりする方法についてまとめています。
PythonでCSVを使うときにはcsvモジュールをimportしてから書き込んだり、読み込んだりします。

載せているサンプルコードはPythonのバージョン3.10.5で動作検証しました。

PythonでCSVを読み込む

まずは、PythonでCSVの内容を読み込んでみます。
open関数でファイルを開いて、開いたファイルオブジェクトをreaderメソッドに渡して読み込みます。

例えば、下記のように読み込むことができます。

import csv

with open('./test.csv') as file:
    reader = csv.reader(file)
    for row in reader:
        for value in row:
            print(value)

最初にimport文でcsvモジュールを読み込んでいます。

そして、ファイルのパス(test.csv)をopen関数に渡して、ファイルを読み込んでfile変数に設定しています。
その次にcsvモジュールのreaderメソッドに読み込んだfileオブジェクト渡しています。

reader変数に返ってきたreaderオブジェクトを格納しています。
このオブジェクトをfor文でループしてファイルの行を読み込んでいます。

行がrow変数にリスト型で格納されます。
最後にrow変数をfor文でループして、ファイルの値をひとつずつ出力するようにしました。

動作を確認する

読み込むtest.csvファイルは下記の内容になります。

"apple","grape","lemon"
"peach","banana","cherry"
"melon","pineapple","orange"

実際にプログラムを動かすと、下記のようにひとつずつ値が取得できることが確認できました。

apple
grape
lemon
peach
banana
cherry
melon
pineapple
orange

ダブルクォーテーションで囲んでいないとき

ダブルクォーテーションで囲んでいない値が含まれている場合でも読み込んでくれます。
例えば、下記のように囲まれていない値が含まれているときです。

apple,grape,lemon
"melon","pineapple","orange"

このように混在している場合でも、プログラムを実行すると、下記のようにそれぞれ値が読み込まれて出力されます。

apple
grape
lemon
melon
pineapple
orange

区切り文字(delimiter)を指定する

区切り文字を指定すると、カンマ以外の文字で値が区切ってある場合にも読み込むことができます。
例えば、下記のようにセミコロン(;)で値が区切ってある場合です。

サーモン;はまち;いか
えび;まぐろ;えんがわ

readerメソッドを呼ぶときに、区切り文字を指定します。
このように名前付き引数で、delimiterを指定することで、特定の文字を区切り文字に設定できます。

reader = csv.reader(file, delimiter=";")

実行すると、下記のように読み込めたことが確認できました。

サーモン
はまち
いか
えび
まぐろ
えんがわ

TSVを読みたいとき

区切り文字がタブ文字になっている場合には、タブを指定することで読み込むことが可能です。
タブ文字を指定する場合には、下記のように\tを使います。

reader = csv.reader(file, delimiter="\t")

囲み文字(quotechar)を指定する

ダブルクォーテーション以外の囲み文字を指定することができます。
readerメソッドに、名前付き引数のquotecharを渡して指定することが可能です。

例えば、下記のようにシングルクォーテーションに変えてみます。

reader = csv.reader(file, quotechar="'")

下記のようにシングルクォーテーションで囲まれているファイルを読み込みます。

'コーヒー','コーラ','水'
'緑茶','リンゴジュース','紅茶'

このように囲み文字を指定したことで、それぞれの値が読み込まれました。

コーヒー
コーラ
水
緑茶
リンゴジュース
紅茶

文字コードを指定して読み込む

文字コードを指定して、CSVファイルを読み込むこともできます。
open関数でファイルにアクセスするときに文字コードを指定します。

例えば、下記のように指定することができます。

with open('./test.csv', encoding="shift-jis") as file:
    reader = csv.reader(file, quotechar="'")
    for row in reader:
        for value in row:
            print(value)

open関数に名前付き引数で、encodingを指定しています。
文字コードとして、Shift JISを指定して読み込むようにしました。

文字コードが違うファイルを開くとき

文字コードが違うファイルを開こうとすると、下記のようにUnicodeDecodeErrorエラーになります。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 1: invalid start byte

開くファイルの文字コードに気をつけて、encodingを指定するようにした方が良さそうです。

PythonでCSVを書き込む

PythonでCSVを書き込む方法です。
CSVに書き込むときには、csvモジュールのwriterメソッドを使うと良いです。

例えば、下記のように書き込むことができます。

import csv

with open('fruits.csv', 'w') as file:
    writer = csv.writer(file)
    writer.writerow(["apple", "grape", "orange"]);
    writer.writerow(["banana", "cherry"]);

最初にcsvモジュールをimport文で読み込んでいます。

その次にopen関数でfruits.csvファイルを上書きモードで開いて、file変数でファイルオブジェクトを格納しています。
そして、writerメソッドにfile変数を渡して、返ってきたwriterオブジェクトをwriter変数に格納しています。

writerオブジェクトからwriterowメソッドを呼び出して、引数として渡したリストをファイルに書き出しています。
writerowメソッドを一回呼ぶと、渡したリストの内容をファイルに1行書いてくれます。
2回呼び出しているので、2行書き出されます。

open関数のファイルモードについては、こちらを確認してください。

動作を確認する

プログラムを実行してfruits.csvを開くと、下記のように書き込まれたことが確認できました。

apple,grape,orange
banana,cherry

リストの値がひとつずつカンマで区切られて出力されました。

値をダブルクォーテーションで囲む

出力した値をダブルクォーテーションで囲むには、writerメソッドの名前付き引数のquotingにcsv.QUOTE_ALLを指定します。

writer = csv.writer(file, quoting=csv.QUOTE_ALL)

このように指定して出力することで、下記のように値がそれぞれダブルクォーテーションで囲まれて出力されます。

"apple","grape","orange"
"banana","cherry"

文字コードを指定して書き込む

文字コードを指定して書き込みたい場合には、読み込み時と同じようにopen関数で使いたい文字コードを指定します。
例えば、下記のようにするとShift JISでCSVを書き込むことができます。

import csv

with open('sushi.csv', 'w', encoding="shift-jis") as file:
    writer = csv.writer(file)
    writer.writerow(["はまち", "マグロ", "サーモン"]);
    writer.writerow(["たまご", "いか"]);

open関数でsushi.csvファイルを開くときに、encoding引数に”shift-jis”を指定しています。
これで、Shift JISの文字コードでファイルに書き込むことができます。

ファイルにリストを一括で書き込む

writerオブジェクトのwriterowsメソッドを使うとリストの内容を一括でファイルに書き込めます。
例えば、下記のように使うことが可能です。

import csv

with open('fruits.csv', 'w') as file:
    writer = csv.writer(file)
    writer.writerows([
        ["みかん", "りんご", "メロン"],
        ["いちご", "バナナ"]
    ]);

writerowメソッドを使っていた箇所を、writerowsメソッドに変えています。

リストをネストして、ふたつのリストをリストに入れて一括して渡しています。
こうすると、リストで渡した内容を一括で書き込むことができます。

おわりに

今回はPythonでCSVの読み込みと書き込みをやってみました。
csvモジュールをインポートして、readerメソッドとwriterメソッドを使うことで、簡単に読み込みと書き込みができました。

まとめると下記のようになります。

■読み込みするとき
・open関数でファイルを開いて、ファイルオブジェクト取得する。
・csv.readerで内容を読み込んで、readerオブジェクトを取得する。
・readerオブジェクトをループして、内容を取得する。
■書き込みするとき
・open関数でファイルを開いて、ファイルオブジェクト取得する。
・csv.writerで、書き込むためのwriterオブジェクトを取得する。
・writerオブジェクトからwriterow(writerows)メソッドを読んでファイルに書き込む。

CSVファイルを開くソフトによっては文字化けしたりするので、CSVファイルの使われ方にも意識して文字コードの指定にも気をつけましょう。

コメント

タイトルとURLをコピーしました