1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

csvファイルを pandas で読み込んで MySQL 8.0.24 に書き込んでみる

Last updated at Posted at 2021-05-20

目的

・Windows 10に MySQL Community Server 8.0.24 をインストール済
・pandas でcsvファイルを読み込む
・python + mysql-connector-python を使ったサンプルコードを書いてみる
・対象データは郵便番号検索の17ISHIKA.CSV
※単にpandas.read_csvを使ったコードを書いてみたかっただけともいう
※pandasでKEN_ALL.CSVを取り込むだけだと11秒位だったので、そのままSQLに流したらどうかを試したかったという
※KEN_ALL.CSVは12万行超えだけど、トータルそう変わらなかった気も

書き込み用テーブルのSQL

SET character_set_client = utf8mb4;
CREATE TABLE zipcode(
	seq nchar(8) 		not null,
	prefcode nchar(3) 	null,
	kubuncode nchar(8) 	null,
	postal5 nchar(5) 	null,
	postal nchar(8) 	null,
	prefkana nchar(20) 	null,
	citykana nchar(40) 	null,
	addrkana nchar(80) 	null,
	prefkanji nchar(20) null,
	citykanji nchar(40) null,
	addrkanji nchar(80) null,
	flg1 int null,
	flg2 int null,
	flg3 int null,
	flg4 int null,
	flg5 int null,
	flg6 int null
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

事前準備

Windows Powershell にて以下を実行する
zipcode.zipcodeを作成する
※zipcodeスキーマを作成後、zipcodeテーブルを作成する


PS C:\> mysql -u root -p
Enter password: ****

mysql> CREATE SCHEMA zipcode;

mysql> use zipcode
Database changed

※テーブル作成用SQLを流す

mysql> SHOW TABLES;
+-------------------+
| Tables_in_zipcode |
+-------------------+
| zipcode           |
+-------------------+

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zipcode            |
+--------------------+

pandas & mysql-connector-python をインストールする


PS C:\> python -V
Python 3.9.5

PS C:\> pip install pandas
Successfully installed pandas-1.2.4

PS > pip3 install mysql-connector-python

pd.read_csvの留意点


import pandas as pd

postal = pd.read_csv("test.CSV", header=None, encoding='cp932')
print(postal)

postal = pd.read_csv("test.CSV", header=None, encoding='cp932', dtype='object')
print(postal)

※ dtypeを指定しないと数字のみの文字列が数値として判別する
※ "060  " -> 60
※ test.CSVの内容
01101,"060  ","0600000","ホッカイドウ","サッポロシチュウオウク",~

     0   1       2        3             4   ... 10 11 12 13  14
0  1101  60  600000  ホッカイドウ  サッポロシチュウオウク  ...  0  0  0  0   0

      0      1        2        3             4   ... 10 11 12 13 14
0  01101  060    0600000  ホッカイドウ  サッポロシチュウオウク  ...  0  0  0  0  0

サンプルコード

# coding:utf-8
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode

import pandas as pd
import mysql.connector as mydb

# コネクションの作成
# アカウントの作成&権限付与が必要
conn = mydb.connect(
    host='192.168.5.xxx',
    port='3306',
    user='demo',
    password='demo',
    database='zipcode'
)

count = 0
postal = pd.read_csv("17ISHIKA.CSV", header=None, encoding='cp932', dtype='object')

# autocommit しない
conn.autocommit = False
cur = conn.cursor()
cur.execute('TRUNCATE TABLE ZIPCODE;')

for ary in postal.values.tolist():
    count = count + 1
    sql = 'INSERT INTO ZIPCODE (' \
        + '  SEQ'       \
        + ', PREFCODE'  \
        + ', KUBUNCODE' \
        + ', POSTAL5'   \
        + ', POSTAL'    \
        + ', PREFKANA'  \
        + ', CITYKANA'  \
        + ', ADDRKANA'  \
        + ', PREFKANJI' \
        + ', CITYKANJI' \
        + ', ADDRKANJI' \
        + ', FLG1' \
        + ', FLG2' \
        + ', FLG3' \
        + ', FLG4' \
        + ', FLG5' \
        + ', FLG6' \
        + ') VALUES ('  \
        + '  \'' + str(count).rjust(8, '0') + '\'' \
        + ', \'' + str(ary[0])[:2] + '\'' \
        + ', \'' + str(ary[0]).strip() + '\'' \
        + ', \'' + str(ary[1]).strip() + '\'' \
        + ', \'' + str(ary[2]) + '\'' \
        + ', \'' + ary[3] + '\'' \
        + ', \'' + ary[4] + '\'' \
        + ', \'' + ary[5] + '\'' \
        + ', \'' + ary[6] + '\'' \
        + ', \'' + ary[7] + '\'' \
        + ', \'' + ary[8] + '\'' \
        + ',   ' + str(ary[9])   \
        + ',   ' + str(ary[10])  \
        + ',   ' + str(ary[11])  \
        + ',   ' + str(ary[12])  \
        + ',   ' + str(ary[13])  \
        + ',   ' + str(ary[14])  \
        + ');'
    # print(sql)
    cur.execute(sql)

conn.commit()
# 挿入したデータの件数を確認する
# cursor = conn.cursor()
cur.execute("SELECT COUNT(*) FROM ZIPCODE;")
row = cur.fetchone()
if row:
    print(row)

cur.close()
conn.close()

参考にしたサイトはこちら

Pythonでmysql-connector-pythonでDB処理+トランザクションの動作検証
MySQLの文字コードをutf8mb4に変更
pandas.DataFrame, SeriesとPython標準のリストを相互に変換
pandasでデータを読み込むときに気を付けること(dtypeの指定)
ユーザーの作成
ユーザーに設定できる権限の種類と一覧

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?