CSVファイルの読み書き – 【Pythonプログラミング2 ~応用編~】

PROGRAMMING

PythonでCSVファイルを読み書きする方法を、演習用プログラムのソースコードを使い、それを実行しながら解説します。

1.pandasライブラリのインストール

本章の最後で、pandasライブラリの紹介をします。
pandas とは、データ解析を容易にする機能を提供するPythonのデータ解析ライブラリです。
CSVファイルや、Excelファイルのような表形式データを扱うときにもとても便利なライブラリです。
pandas を使うには、事前にインストール作業が必要です。
手順を追って説明します。

① コマンドプロンプトを管理者として実行

Windows画面の左下にある検索ボックスに、キーボードから cmd と入力します。
右上に コマンドプロンプト が表示されていることを確認して、『管理者として実行』をクリックします。

コマンドプロンプトを管理者として実行


ユーザー アカウント制御 ダイアログボックスが表示されて、「このアプリがデバイスに変更を加えることを許可しますか?」と聞いてくるので、『はい』をクリックします。
管理者:コマンドプロンプト が起動します。

Microsoft Windows [Version 10.0.22631.4317]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\System32>

 

② インストールされているライブラリの確認

管理者:コマンドプロンプト でキーボードから pip list と入力して、 Enter  キーを押下します。
インストールされているライブラリの一覧が表示されます。
pandas がインストールされていないことを確認します。

Microsoft Windows [Version 10.0.22631.4317]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\System32>pip list
Package Version
------- -------
pip     24.2
pywin32 307

C:\Windows\System32>

 

③ pandas のインストール

管理者:コマンドプロンプト でキーボードから pip install pandas と入力して、 Enter  キーを押下します。
インストールには少々時間がかかります。
最後の行に『 Successfully installed 』と表示されれば、インストール完了です。

C:\Windows\System32>pip install pandas
Collecting pandas
  Downloading pandas-2.2.3-cp312-cp312-win_amd64.whl.metadata (19 kB)
Collecting numpy>=1.26.0 (from pandas)
  Using cached numpy-2.1.2-cp312-cp312-win_amd64.whl.metadata (59 kB)
Collecting python-dateutil>=2.8.2 (from pandas)
  Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting pytz>=2020.1 (from pandas)
  Using cached pytz-2024.2-py2.py3-none-any.whl.metadata (22 kB)
Collecting tzdata>=2022.7 (from pandas)
  Downloading tzdata-2024.2-py2.py3-none-any.whl.metadata (1.4 kB)
Collecting six>=1.5 (from python-dateutil>=2.8.2->pandas)
  Using cached six-1.16.0-py2.py3-none-any.whl.metadata (1.8 kB)
Downloading pandas-2.2.3-cp312-cp312-win_amd64.whl (11.5 MB)
   ---------------------------------------- 11.5/11.5 MB 1.4 MB/s eta 0:00:00
Using cached numpy-2.1.2-cp312-cp312-win_amd64.whl (12.6 MB)
Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Using cached pytz-2024.2-py2.py3-none-any.whl (508 kB)
Downloading tzdata-2024.2-py2.py3-none-any.whl (346 kB)
Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: pytz, tzdata, six, numpy, python-dateutil, pandas
Successfully installed numpy-2.1.2 pandas-2.2.3 python-dateutil-2.9.0.post0 pytz-2024.2 six-1.16.0 tzdata-2024.2

C:\Windows\System32>

 

【補足】学校や会社内のパソコンをお使いの方へ
pip install pandas が失敗する場合があります。
この場合は、インストールする際にプロキシサーバーの情報を渡す必要があります

プロキシサーバーの情報は、システム管理者に確認してください。
・プロキシサーバー名
・ポート番号

プロキシサーバーの情報を取得できましたら、pandas のインストールは次のようにします。
pip install --proxy="プロキシサーバー名:ポート番号" pandas

④ pandas のインストールの確認

管理者:コマンドプロンプト でキーボードから pip list と入力して、 Enter  キーを押下します。
インストールされているライブラリの一覧が表示されます。
一覧に pandas があることを確認します。

C:\Windows\System32>pip list
Package         Version
--------------- -----------
numpy           2.1.2
pandas          2.2.3
pip             24.2
python-dateutil 2.9.0.post0
pytz            2024.2
pywin32         307
six             1.16.0
tzdata          2024.2

C:\Windows\System32>

 

2.演習用プログラムのダウンロード

演習用プログラム( practice14.py )とCSVファイル( csv_file1.csv )をダウンロードします。
演習用プログラムは テキストファイルになっているので、エクスプローラーを使って拡張子を .txt から .py に変更します。
practice14.py、csv_file1.csv を Python をインストールしたフォルダ(今回は C:\Python)に置きます。



3.ソースコードの表示

メモ帳を使って、演習用プログラム( practice14.py )を開きます。

practice14.py

practice14.py


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

最初にCSVファイルを読み込む方法を見ていきます。

① CSVファイルを読み込む

まずは、コマンドプロンプト で practice14.py を実行します。
プログラムを実行する方法は、こちらの記事『ファイルに保存されたプログラムの実行』を参照します。
以下のように表示されます。

C:\Users\kotablog>python C:\Python\practice14.py

*** CSVファイルの読み込み ****

csv_file1.csvを読み込みます
['商品コード', '商品名', '金額']
['A0001', 'みかん', '100']
['A0002', 'メロン', '200']
['A0003', 'いちご', '300']
['A0004', 'バナナ', '400']
['A0005', 'トマト', '500']

 
プログラムソースを確認します。


01 # -*- coding: utf-8 -*-
02 """
03 演習プログラム14
04 
05   CSVファイルの読み書き
06 
07 """
08 import sys     # sysモジュールのインポート
09 import csv     # CSVファイルの読み書き用の標準ライブラリ
10 import pandas  # pandasライブラリのインポート
11 
12 print("\n*** CSVファイルの読み込み ****")
13 
14 # CSVファイルを読み込む
15 print("\ncsv_file1.csvを読み込みます")
16 file_name = r"C:\Python\csv_file1.csv"  # ファイルのフルパス名
17 with open(file_name) as f:              # ファイルを開く
18   reader = csv.reader(f)                # CSVファイルの読み込み
19   for row in reader:                    # 行ごとのデータをリストで取得
20     print(row)                          # 1行のデータを表示
21 
22 #終了1
23 sys.exit()

09行目で CSVファイルを読み書きするための標準ライブラリをインポートしています。
10行目で 先ほどインストールした pandasライブラリをインポートしています。

16行目で変数 file_name に csv_file1.csv のフルパスファイル名をセットしています。
17行目で with文を使って、CSVファイルを開いています。
18行目で reader()メソッドを使ってCSVファイルを読み込み、reader オブジェクトに格納しています。
19行目の for文を使って、行ごとにデータを取り出しています。
20行目で 行のデータ(リスト)を表示しています。

② 2次元リスト(リストのリスト)として取得

ソースコード #終了1 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

2次元リスト(リストのリスト)として取得します
[['商品コード', '商品名', '金額'], 
 ['A0001', 'みかん', '100'], 
 ['A0002', 'メロン', '200'], 
 ['A0003', 'いちご', '300'], 
 ['A0004', 'バナナ', '400'], 
 ['A0005', 'トマト', '500']]

 
※見やすくするために改行しています

プログラムソースを確認します。


25 # 2次元リスト(リストのリスト)として取得(リスト内包表記を使用)
26 print("\n2次元リスト(リストのリスト)として取得します")
27 with open(file_name) as f:              # ファイルを開く
28   reader = csv.reader(f)                # CSVファイルの読み込み
29   list2d = [row for row in reader]      # 2次元リストで取得
30 print(list2d)                           # 2次元リストを表示
31 
32 #終了2
33 sys.exit()

28行目で reader()メソッドを使ってCSVファイルを読み込み、reader オブジェクトに格納しています。
29行目で リスト内包表記を使って、reader オブジェクトから2次元リストとして変数 list2d に格納しています。
30行目で 2次元リストを表示しています。

Pythonリスト内包表記の使い方

③ 数値にできるものだけを数値化

金額の列は数値です。数値の文字列は数値に変換しておくと便利です。

ソースコード #終了2 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

数値にできるものだけを数値化します
[['商品コード', '商品名', '金額'], 
 ['A0001', 'みかん', 100], 
 ['A0002', 'メロン', 200], 
 ['A0003', 'いちご', 300], 
 ['A0004', 'バナナ', 400], 
 ['A0005', 'トマト', 500]]

 
※見やすくするために改行しています

プログラムソースを確認します。


35 # 数値にできるものだけを数値化(リスト内包表記と三項演算子を使用)
36 print("\n数値にできるものだけを数値化します")
37 list2d = [[int(v) if v.isdecimal() else v for v in row ] for row in list2d]  # 数値化
38 print(list2d)                           # 2次元リストを表示
39 
40 #終了3
41 sys.exit()

37行目で リスト内包表記 と 三項演算子を使って数値にできる要素を数値に変換しています。

リスト内包表記
[式 for 任意の変数名 in イテラブルオブジェクト]

三項演算子
条件式が真のときに返す値 if 条件式 else 条件式が偽のときに返す値

④ 見出し行(ヘッダー)を取り除く

見出し行を取り除いてデータだけにしておくと便利です。

ソースコード #終了3 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

見出し行(ヘッダー)を取り除きます
[['A0001', 'みかん', 100], 
 ['A0002', 'メロン', 200], 
 ['A0003', 'いちご', 300], 
 ['A0004', 'バナナ', 400], 
 ['A0005', 'トマト', 500]]

 
※見やすくするために改行しています

プログラムソースを確認します。


43 # 見出し行(ヘッダー)を取り除く(リスト内包表記を使用)
44 print("\n見出し行(ヘッダー)を取り除きます")
45 list2d = [row for row in list2d[1:]]    # ヘッダーの除去
46 print(list2d)                           # 2次元リストを表示
47 
48 #終了4
49 sys.exit()

45行目で 見出し行は1行目(インデックスは 0)なので、2行目以降(インデックスは 1)で2次元リストを作成しています。(リスト内包表記)

⑤ 行、要素、列を取得

ソースコード #終了4 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

3行目を取得します
['A0003', 'いちご', 300]

3行目の2列目を取得します
いちご

3列目(金額)を取得します
[100, 200, 300, 400, 500]

金額の合計を計算します
合計は 1500 です

 
プログラムソースを確認します。


51 # 行を取得
52 print("\n3行目を取得します")
53 datalist = list2d[2]                    # 0始まりのインデックスを指定
54 print(datalist)                         # 行のリストを表示
55 
56 # 要素を取得
57 print("\n3行目の2列目を取得します")
58 data = list2d[2][1]                     # [行][列]の順で指定
59 print(data)                             # 要素を表示
60 
61 # 列を取得
62 print("\n3列目(金額)を取得します")
63 list2d_T = [list(x) for x in zip(*list2d)]  # 行と列を入れ替え
64 datalist = list2d_T[2]                  # 0始まりのインデックスを指定
65 print(datalist)
66 
67 print("\n金額の合計を計算します")
68 total = sum(datalist)                   # リストの要素の合計値を計算
69 print("合計は、" + str(total) + " です")
70 
71 #終了5
72 sys.exit()

行を取得(3行目)
53行目で 2次元リスト( list2d )から、3行目のデータ(インデックスは 2)を取り出しています。

要素を取得(3行目の2列目)
58行目で 2次元リスト( list2d )から、3行目のデータ(インデックスは 2)さらに 2列目の要素(インデックスは 1)を取り出しています。

列を取得(3列目の金額)
列を取得するにはまず行と列を入れ替えます。
63行目で リスト内包表記を使い、行と列を入れ替えて2次元リスト( list2d_T )に格納しています。

list2d_T の内容
[['A0001', 'A0002', 'A0003', 'A0004', 'A0005'],
['みかん', 'メロン', 'いちご', 'バナナ', 'トマト'],
[100, 200, 300, 400, 500]]

64行目で 2次元リスト( list2d_T )から、行と列を入れ替えているので3行目のデータ(インデックスは 2)を取り出しています。

金額の合計を計算
68行目で sum()関数を使って金額のリストの要素を合計しています。

5.CSVファイルの書き込み

① CSVファイルに1行ずつ書き込む

ソースコード #終了5 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** CSVファイルの書き込み ****

csv_file2.csvに1行ずつ書き込みます
csv_file2.csv の内容を確認しましょう

 
エクスプローラから、csv_file2.csv を開いて内容を確認してください。

プログラムソースを確認します。


74 print("\n*** CSVファイルの書き込み ****")
75 
76 # CSVファイルに1行ずつ書き込む
77 print("\ncsv_file2.csvに1行ずつ書き込みます")
78 file_name = r"C:\Python\csv_file2.csv"  # ファイルのフルパス名
79 with open(file_name, 'w', newline="") as f:  # 書き込みモードでファイルを開く
80   writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
81   writer.writerow(['商品コード', '商品名', '金額'])
82   writer.writerow(['A0001', 'みかん', 100])
83 print("csv_file2.csv の内容を確認しましょう")
84 
85 #終了6
86 sys.exit()

79行目で CSVファイルを書き込みモード( 'w' )で開いています。
このとき、引数に newline="" を指定し忘れると、行毎に空行が入ってしまいます。

80行目の writer()メソッドの引数 quoting は以下の通りです。
・quoting=csv.QUOTE_ALL : すべての要素が引用符で囲まれる。
・quoting=csv.QUOTE_NONNUMERIC : 数値でない要素が引用符で囲まれる。

81行目と82行目の writerow()メソッドで行のデータを書き込んでいます。

② CSVファイルに2次元リストを書き込む

ソースコード #終了6 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

csv_file3.csvに2次元リストを書き込みます
csv_file3.csv の内容を確認しましょう

 
エクスプローラから、csv_file3.csv を開いて内容を確認してください。

プログラムソースを確認します。


 88 # CSVファイルに2次元リストを書き込む
 89 print("\ncsv_file3.csvに2次元リストを書き込みます")
 90 file_name = r"C:\Python\csv_file3.csv"  # ファイルのフルパス名
 91 list2d = [['商品コード', '商品名', '金額'],\
 92           ['A0001', 'みかん', 100],\
 93           ['A0002', 'メロン', 200],\
 94           ['A0003', 'いちご', 300],\
 95           ['A0004', 'バナナ', 400],\
 96           ['A0005', 'トマト', 500]]
 97 with open(file_name, 'w', newline="") as f:  # 書き込みモードでファイルを開く
 98   writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
 99   writer.writerows(list2d)
100 print("csv_file3.csv の内容を確認しましょう")
101 
102 #終了7
103 sys.exit()

90行目で 変数 file_name に csv_file3.csv のフルパスファイル名をセットしています。

91行目から96行目で CSVファイルに書き込む2次元リストを用意しています。
Pythonでは、行の末尾に \ を付けることで、コーディングを複数行に記述することができます。

97行目で CSVファイルを書き込みモード( 'w' )で開いています。
引数の newline="" は、行毎に空行が入らないようにしています。

98行目で 数値でない要素が引用符で囲まれるように指定しています。

99行目の writerows()メソッドで複数行のデータを書き込んでいます。

③ 追記モードでCSVファイルに書き込む

ソースコード #終了7 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

csv_file3.csvにデータを追加します
csv_file3.csv の内容を確認しましょう

 
エクスプローラから、csv_file3.csv を開いて内容を確認してください。

プログラムソースを確認します。


105 # 追記モードでCSVファイルに書き込む
106 print("\ncsv_file3.csvにデータを追加します")
107 with open(file_name, 'a', newline="") as f:  # 追記モードでファイルを開く
108   writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
109   writer.writerow(['A0006', 'ぶどう', 600])
110 print("csv_file3.csv の内容を確認しましょう")
111 
112 #終了8
113 sys.exit()

107行目で CSVファイルを追記モード( 'a' )で開いています。
108行目で 数値でない要素が引用符で囲まれるように指定しています。
109行目の writerow()メソッドで行のデータを書き込んでいます。

④ CSVファイルのデータを修正する

商品コード 'A0005' の商品名を 'トマト' から 'りんご' に修正します。

ソースコード #終了8 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

csv_file3.csvのデータを修正します
csv_file3.csv の内容を確認しましょう

 
エクスプローラから、csv_file3.csv を開いて内容を確認してください。

プログラムソースを確認します。


115 # CSVファイルのデータを修正する
116 print("\ncsv_file3.csvのデータを修正します")
117 with open(file_name) as f:              # ファイルを開く
118   reader = csv.reader(f)                # CSVファイルの読み込み
119   list2d = [row for row in reader]      # 2次元リストで取得
120   list2d = [[int(v) if v.isdecimal() else v for v in row ] for row in list2d]  # 数値化
121 
122 for i in range(len(list2d)):
123   datalist = list2d[i]
124   if list2d[i][0] == "A0005":
125     list2d[i][1] = "りんご"
126 
127 with open(file_name, 'w', newline="") as f:  # 書き込みモードでファイルを開く
128   writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
129   writer.writerows(list2d)
130 print("csv_file3.csv の内容を確認しましょう")
131 
132 #終了9
133 sys.exit()

117行目で csv_file3.csv を開いています。
118行目から120行目で ファイルを読み込み、2次元リスト( list2d )に格納して、数値にできる要素を数値化しています。

122行目から125行目の for文で、商品コードが 'A0005' であれば 商品名を 'トマト' から 'りんご' に書き換えています。

127行目で CSVファイルを書き込みモード( 'w' )で開いています。
引数の newline="" は、行毎に空行が入らないようにしています。
129行目の writerows()メソッドで2次元リストのデータを書き込んでいます。

6.pandasでのCSVファイルの読み書き

① pandasを使ったCSVファイルの修正

pandasを使って、商品コード 'A0005' の商品名を 'りんご' から 'レモン' に修正します。

ソースコード #終了9 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** pandasでのCSVファイルの読み書き ****

csv_file3.csvのデータをpandasを使って修正します

【修正前】
   商品コード  商品名   金額
0  A0001  みかん  100
1  A0002  メロン  200
2  A0003  いちご  300
3  A0004  バナナ  400
4  A0005  りんご  500
5  A0006  ぶどう  600

【修正後】
   商品コード  商品名   金額
0  A0001  みかん  100
1  A0002  メロン  200
2  A0003  いちご  300
3  A0004  バナナ  400
4  A0005  レモン  500
5  A0006  ぶどう  600

csv_file3.csv の内容を確認しましょう

 
プログラムソースを確認します。


135 print("\n*** pandasでのCSVファイルの読み書き ****")
136 
137 # pandasを使ったCSVファイルの修正
138 print("\ncsv_file3.csvのデータをpandasを使って修正します")
139 df = pandas.read_csv(file_name, encoding='shift_jis')
140 print("\n【修正前】")
141 print(df)
142 
143 for index, data in df.iterrows():
144   商品コード = str(data['商品コード'])
145   商品名     = str(data['商品名'])
146   if 商品コード == "A0005":
147     df.loc[index, '商品名'] = "レモン"
148 print("\n【修正後】")
149 print(df)
150 
151 df.to_csv(file_name, encoding='shift_jis', index=False)
152 print("\ncsv_file3.csv の内容を確認しましょう")
153 
154 sys.exit()

139行目で pandasの read_csv()メソッドで csv_file3.csv を読み込んで、データフレーム( df )にセットしています。
143行目から147行目の for文で、商品コードが 'A0005' であれば 商品名を 'レモン' に書き換えています。
151行目で pandasの to_csv()メソッドで csv_file3.csv に書き込んでいます。

pandasを使った方が、コーディングが簡潔になります。

pandasについては、別章で詳しく解説します。
 

<テキストファイルの読み書き CSVファイルの読み書き xlwingsを使った Excelファイルの読み書き>
タイトルとURLをコピーしました