liquidjumper Python Pythonで日本語を含むCSV ファイルを読み書きする方法-MAYA アーティストのスクリプト入門-

Pythonで日本語を含むCSV ファイルを読み書きする方法-MAYA アーティストのスクリプト入門-

python_csvfile_topimage

Pythonでテキストファイルを読み込む方法は以前紹介しました。

CSVファイル自体もテキストファイルなので、他のテキストファイルと同様に
open()で開いて読み込み後に文字列処理をすれば、意図した結果を得られるでしょう。

でも文字処理だけでCSVファイルの内容を取得するのは効率的ではありませんし、そもそもCSVフォーマットの意味が無くなってしまいます。

Python にはCSVフォーマットで書かれたテキストを簡単に扱うことが出来るモジュール「CSVモジュール」が備わっています。

このCSVモジュールを使うことでPythonでCSVファイルを簡単に読み書き利用する事が可能になります。

この記事ではPythonでCSVファイルを扱うことが可能になる「CSVモジュール」の使い方を紹介したいと思います。


CSVファイル

CSVファイルは以下のCSVフォーマットで定められた規則に沿って書かれたテキストファイルです。
ファイルの拡張子は「.csv」で規則自体が非常にシンプルで取り扱やすく、ほとんどの表計算ソフトが対応しています。

  • 列を「,」カンマで区切って要素を並べる
  • 行を改行で区切る

表計算ソフトで汎用的に扱うことができるデータフォーマットですが、ファイル自体はただのテキストファイルなのでテキストエディタなどで開いて閲覧や編集をする事も可能です。

GoogleスプレッドシートやMicrosoft Excelなど相手側が何の表計算ソフトを使っているのかわからない時はCSVファイルが重宝します。


文字コードUTF-8で保存したファイル名「csv_test_e.csv」のCSVファイルを作りました。

csv_test_e.csv
csv_test_e.csv

CSVモジュールを使ってPythonでCSVファイルを読み込む

CSVファイルは前の項目に書いたようにテキストファイルです。なのでPythonでCSVファイルを開くには他のテキストファイル同様に

open()

関数を使います。


open()関数で開いたFileオブジェクトをCSVフォーマットに適した読み込み方をしてくれるのがCSVモジュールの

csv.read()

です。

import csv

csvfile = "D:/liquidJumper/csv_test_e.csv"
csvfile_open = open(csvfile)
csvfile_csvread =csv.reader(csvfile_open)

for i_csvfile_csvread in csvfile_csvread:
    print(i_csvfile_csvread)

csvfile_open.close()


説明:


csvfile_open = open(csvfile)

関数open()でcsvファイルを開いてFileオブジェクトを変数「csvfile_open」に代入します。

csvfile_csvread =csv.reader(csvfile_open)

csv.reader()でcsvfile_openの内容を読み込み、変数「csvfile_csvread」にリストで代入します。

for i_csvfile_csvread in csvfile_csvread:

    print(i_csvfile_csvread)

変数「csvfile_csvread」は行毎にリストで読み込まれているのでfor文を使って一行毎にprint出力します。

csvfile_open.close()

Fileオブジェクトを閉じます


結果:

一行毎にリスト化されて出力されました。

[‘date’, ‘Host city’, ‘The number of participants’]
[‘2020/5/9’, ‘NY’, ‘30000’]
[‘2020/5/10’, ‘London’, ‘28000’]
[‘2020/5/11’, ‘Tokyo’, ‘31000’]
[‘2020/5/12’, ‘Melbourne’, ‘15000’]
[‘2020/5/13’, ‘Amsterdam’, ‘4300’]
[‘2020/5/14’, ‘Vienna’, ‘4500’]
[‘2020/5/15’, ‘Munich’, ‘8000’]

リストの二列目の要素を取得する


リストの二列目の要素を取得したい場合は

import csv

csvfile = "D:/liquidJumper/csv_test_e.csv"
csvfile_open = open(csvfile)
csvfile_csvread =csv.reader(csvfile_open)

for i_csvfile_csvread in csvfile_csvread:
    print(i_csvfile_csvread[1])

csvfile_open.close()


説明:

print(i_csvfile_csvread[1])

各行のリストの二番目を指定してprint出力

結果:

リストの二番目に並んでいる都市名が出力されました。

Host city
NY
London
Tokyo
Melbourne
Amsterdam
Vienna
Munich

日本語(マルチバイト文字)の要素があるCSVファイルを読み込む場合

以下の様な日本語で書かれたCSVファイルを同じスクリプトコードで読み込むと

ファイル名「csv_test_j.csv」

csv_test_j.csv
csv_test_j.csv


結果:

マルチバイトの文字列がユニコードで出力されてしまいます。

[‘\xe6\x97\xa5\xe6\x99\x82’, ‘\xe9\x96\x8b\xe5\x82\xac\xe9\x83\xbd\xe5\xb8\x82’, ‘\xe5\x8f\x82\xe5\x8a\xa0\xe4\xba\xba\xe6\x95\xb0’]
[‘2020/5/9’, ‘\xe3\x83\x8b\xe3\x83\xa5\xe3\x83\xbc\xe3\x83\xa8\xe3\x83\xbc\xe3\x82\xaf’, ‘30000’]
[‘2020/5/10’, ‘\xe3\x83\xad\xe3\x83\xb3\xe3\x83\x89\xe3\x83\xb3’, ‘28000’][‘2020/5/11’, ‘\xe6\x9d\xb1\xe4\xba\xac’, ‘31000’]
[‘2020/5/12’, ‘\xe3\x83\xa1\xe3\x83\xab\xe3\x83\x9c\xe3\x83\xab\xe3\x83\xb3’, ‘15000’][‘2020/5/13’, ‘\xe3\x82\xa2\xe3\x83\xa0\xe3\x82\xb9\xe3\x83\x86\xe3\x83\xab\xe3\x83\x80\xe3\x83\xa0’, ‘4300’]
[‘2020/5/14’, ‘\xe3\x82\xa6\xe3\x82\xa3\xe3\x83\xbc\xe3\x83\xb3’, ‘4500’]
[‘2020/5/15’, ‘\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\xb3\xe3\x83\x98\xe3\x83\xb3’, ‘8000’]

Python3.x系で日本語のCSVファイルを読み込む場合

Python3.x系の場合open()関数に文字コードを指定できるので

import csv

csvfile = "D:/liquidJumper/csv_test_j.csv"
csvfile_open = open(csvfile,"r",encoding="utf-8")
csvfile_csvread =csv.reader(csvfile_open)

for i_csvfile_csvread in csvfile_csvread:
    print(i_csvfile_csvread)

csvfile_open.close()


説明:

csvfile_open = open(csvfile,"r",encoding="utf-8")

open()にencoding=”utf-8″と文字コードを指定

結果:

日本語が正しく出力されました。

[‘日時’, ‘開催都市’, ‘参加人数’]
[‘2020/5/9’, ‘ニューヨーク’, ‘30000’]
[‘2020/5/10’, ‘ロンドン’, ‘28000’]
[‘2020/5/11’, ‘東京’, ‘31000’]
[‘2020/5/12’, ‘メルボルン’, ‘15000’]
[‘2020/5/13’, ‘アムステルダム’, ‘4300’]
[‘2020/5/14’, ‘ウィーン’, ‘4500’]
[‘2020/5/15’, ‘ミュンヘン’, ‘8000’]

Python2.x系で日本語のCSVファイルを読み込む場合

しかし、この記事の対象であるMAYAのPythonは、Python2.7系の為open()に文字コードを指定することはできません。

対処法として読み込んだUnicodeの要素を、デコードして日本語文字列に変換します。

リストの二番目に並んだ都市名を日本語で出力

import csv
import codecs

csvfile = "D:/liquidJumper/csv_test_j.csv"
csvfile_open = open(csvfile)
csvfile_csvread =csv.reader(csvfile_open)

for i_csvfile_csvread in csvfile_csvread:
    csvfile_decode = codecs.decode(i_csvfile_csvread[1],"utf-8")
    print(csvfile_decode)

csvfile_open.close()


説明:

csvfile_decode = codecs.decode(i_csvfile_csvread[1],"utf-8")
print(csvfile_decode)

codecsモジュールのcodecs.decode()で文字コードを”utf-8″にデコード

結果:

リストの二番目に並んでいる都市名が日本語で出力されました

開催都市
ニューヨーク
ロンドン
東京
メルボルンアム
ステルダム
ウィーン
ミュンヘン


基本的にリストの要素をデコードすれば日本語も扱えるので、大きな問題にはならないと思います。面倒ですけど。


CSVモジュールを使ってPythonでCSVファイルに追記する

PythonでCSVモジュールを使ってCSVファイルに追記する場合は

csv.writer()

を使います。

Python2.x系のPythonコードはopen()に文字コードを指定できないので以下のようにしました。

# coding:utf-8
import csv

csvfile = "D:/liquidJumper/csv_test_j.csv"
csvfile_open = open(csvfile,"a")
csvfile_writer =csv.writer(csvfile_open, lineterminator='\n')
csvfile_writer.writerow(['2020/7/21','大阪',15000])
csvfile_open.close()


説明:

csvfile_open = open(csvfile,"a")

追記したいのでモードを「”a”」に設定しました。

csvfile_writer =csv.writer(csvfile_open, lineterminator='\n')

writer()のオプション lineterminator で改行方法を指定しました。

lineterminator の改行コードに「’\n’」を設定

このオプションを入れることで後で記述する不具合を回避できます。

csvfile_writer.writerow(['2020/7/21','大阪',15000])

追加する行をリストで記述します。※数値は「”」で囲まなくても文字列として処理されます。

結果:

最後の行に[‘2020/7/21′,’大阪’,15000]が追加されました。

最後の行に['2020/7/21','大阪',15000]が追加

行をまとめて追加する場合

行を追加する場合

Fileオブジェクト.writerow()

を使いましたが、複数の行をまとめて追加する場合は

row_lists = [["2020/2","yodobashi_camera",12],["2020/4","bic_camera",812],["2020/6","yamada_denki",2]]

と追加する行をリスト化して

Fileオブジェクト.writerows()

で複数の行を一度に追加します。

# coding:utf-8
import csv

csvfile = "D:/liquidJumper/csv_test_new.csv"
row_lists = [["2020/2","ヨドバシカメラ",12],["2020/4","ビックカメラ",812],["2020/6","ヤマダ電機",2]]
csvfile_open = open(csvfile,"w")
csvfile_writer =csv.writer(csvfile_open, lineterminator='\n')
csvfile_writer.writerows(row_lists)
csvfile_open.close()


説明:

row_lists = [["2020/2","ヨドバシカメラ",12],["2020/4","ビックカメラ",812],["2020/6","ヤマダ電機",2]]

追加する行をリストにして変数「row_lists」に代入しました。

csvfile_open = open(csvfile,"w")

新規のCSVファイルに記述したいのでモードを”w”に設定、Fileオブジェクトを「csvfile_open」に代入


csvfile_writer.writerows(row_lists)

.writerows()を使って「row_lists」のリストの内容を追加

結果:

新規のCSVファイル「csv_test_new.csv」が作られ以下の内容が書かれました。

csv_test_new.csv
csv_test_new.csv

CSVモジュールで行を追記する時に余分な改行の追加を回避する方法

WindwosでCSVモジュールを使い、行の追加

.writerow()
.writerows()

を行うと、余計な改行が追加されてしまいます。

CSVファイル「csv_test_j.csv」に行を追加します。

# coding:utf-8
import csv

csvfile = "D:/liquidJumper/csv_test_j.csv"
csvfile_open = open(csvfile,"a")
csvfile_writer =csv.writer(csvfile_open)
csvfile_writer.writerow(['2020/8/5','福岡',11000])
csvfile_open.close()


説明:

csvfile_writer =csv.writer(csvfile_open)

csv.writer()に改行方法のオプションlineterminatorを設定しません

実行:

「ミュンヘン」と追加した「福岡」の間に余計な改行が入ってしまいました。

「ミュンヘン」と追加した「福岡」の間に余計な改行

Python3.x系で余計な改行を回避して追記する方法

Python3.x系 はopen()にオプション

newline=”

を設定する事によって回避出来ます。

import csv

csvfile = "D:/liquidJumper/csv_test_j.csv"
csvfile_open = open(csvfile,"a" ,encoding="utf-8",newline='')
csvfile_writer =csv.writer(csvfile_open)
csvfile_writer.writerow(['2020/8/5','福岡',11000])
csvfile_open.close()


説明:

csvfile_open = open(csvfile,"a" ,encoding="utf-8",newline='')

open()で文字コード”utf-8″を設定、改行が追加されないようにnewline=”を設定しました

結果:

「ミュンヘン」と「福岡」の間に余計な改行が無く追加されました。

「ミュンヘン」と「福岡」の間に余計な改行が無

Python2.x系で余計な改行を回避して追記する方法

Python2.x系はopen()でnewline=”を設定する事が出来ません。
回避方法として、

csv.writer(Fileオブジェクト, lineterminator='\n')

csv.writer()に改行方法のオプションで”\n”を設定して回避します。

# coding:utf-8
import csv

csvfile = "D:/liquidJumper/csv_test_j.csv"
csvfile_open = open(csvfile,"a")
csvfile_writer =csv.writer(csvfile_open, lineterminator='\n')
row_lists = [['2020/8/5','福岡',11000],['2020/9/21','大阪',15000],['2020/10/18','北海道',7000]]
csvfile_writer.writerows(row_lists)
csvfile_open.close()


説明:

row_lists = [['2020/8/5','福岡',11000],['2020/9/21','大阪',15000],['2020/10/18','北海道',7000]]

追加する複数の行をリスト化して変数「row_lists」に代入しました

csvfile_writer.writerows(row_lists)

.writerows()で複数の行を追加

結果:

「ミュンヘン」以下に余計な改行が無く追加されました。

「ミュンヘン」以下に余計な改行が無く追加


まとめ

PythonでCSVファイルを読み書きする方法を紹介しました。

PythonにはCSVモジュールが備わっているので、CSVファイルを簡単に扱うことができます。

だだ問題として、日本語を含めたマルチバイト文字に関しては扱いに手間取る場面も多く非常に厄介です。

Python3.x系はこのマルチバイト部分は改善され問題となることはありませんが、この記事の対象であるMAYAのPythonは2.x系なので未だ問題も多く工夫が必要です。

それでも、CSVファイルを扱うには非常に有効なモジュールなので、使い方を是非覚えておくと良いと思います。








 TechAcademy [テックアカデミー] は、選抜された現役エンジニアから学べるオンライン・プログラミングスクールです。

 自宅からでもWeb制作・プログラミング・アプリ開発などが習得できるさまざまなコースをラインナップ。

 非エンジニアでスキルを磨きたい方から、フリーランス、就職/転職を目指す方まで、専属のメンターがサポート。

 最近は副業ブームもありはじめての副業コース が人気です。






𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



あわせてよく読まれている記事