[Python] 212 MySQL 01 MAMPデータベースの読み込み

スクレイピングにより得られた競馬データのデータベース化に着手します。

レース結果のCSVファイルをMAMPのMySQLにインポートし、Pythonで読み込みを実行しました。

CSVファイルはphpMyAdminによりインポートしました。

スクレイピングで苦労しつつ競馬データを揃えたまでは良かったのですが、データベース化で取っ掛かりをつかめずに放置していました。

ところがWordPressとサーバを扱うようになってMAMPの存在を知り、そこから一気に道筋が見えてきました。

データベースについては全く考えていなかったので、意外な展開です。

import mysql.connector

config = {
  'user': 'root',
  'password': 'root',
  'host': 'localhost',
  'port': 3306,
  'database': 'horse_racing',
  'raise_on_warnings': True
}

conn = mysql.connector.connect(**config)

cursor = conn.cursor()

try:
    cursor.execute('SELECT `COL 4` FROM `TABLE 1`')

finally:
    result = cursor.fetchall()
    print(result)
    cursor.close()
    conn.close()
--------------------------------------------------

出力
--------------------------------------------------
[('3',), ('馬名',), ('エイカイマドンナ',), ('イリスファルコン',), ('ヤマニンプレシオサ',), ('ナタラディーヴァ',), ('アセンダント',), ('グラウシュトラール',), ('グランフェスタ',), ('ムーンフェアリー',), ('セレンディピア',), ('リインフォース',), ('グレイトゲイナー',), ('クルークヴァール',), ('フジマサディープ',), ('シルヴァーメテオ',), ('ネオアンビシャス',), ('エイカイキャロル',), ('',), ('',), ('',)]

[Python] 211 pip関連コマンド

pip自体のアップグレード

python -m pip install --upgrade pip

ライブラリのインストール

python -m pip install [ライブラリ名]

ライブラリのリスト表示

python -m pip list

アップデート可能なライブラリのリスト表示

python -m pip list --outdated

ライブラリを指定してのアップデート

python -m pip install -U [ライブラリ名]

ライブラリのバージョンを指定してのインストール

python -m pip install [ライブラリ名]==x.x.x

ライブラリの利用可能なバージョン確認

python -m pip install [ライブラリ名]==

ライブラリのアンインストール(yes省略)

python -m pip uninstall -y [ライブラリ名]

[Python] 210 pyenv関連コマンド

pyenv自体のインストール

brew install pyenv

pyenvの最新バージョンと導入済みバージョンの確認

brew info pyenv

pyenvのアップデート

brew upgrade pyenv

インストールできるPythonのリスト

pyenv install -l

Pythonのインストール(3.9.2の場合)

pyenv install 3.9.2

インストールしたPythonの表示

pyenv versions

バージョンの切替(global)

pyenv global 3.9.2

バージョンの切替(local)

cd ~/notebook
pyenv local anaconda3-2021.05

[Python] 209 pyenv + virtualenvで仮想環境を構築する

PythonとPHPを比較すると、言語の構造としてはほぼ同じであり時間的学習コストの割りに新たに得られるものが少ないので、PHPを本格的に学ぶべきかどうか躊躇していました。

そんな折、Djangoを使えばPythonでWebアプリが開発できることを知り早速環境構築に着手しました。

ただpipによるパッケージ管理では依存関係をチェックしてもらえないため、インストールするパッケージによっては途端にPythonが不調になったりします。

これまで散々痛い目にあってきたので流石に学習し、環境が大きく変わる際は仮想環境を使うことにしました。

今回はwebappというプロジェクトの仮想環境を作成し、そこにDjangoをインストールします。

仮想環境の作り方は以下の通りです。

<Python3.9.0でwebapp仮想環境を作る場合>

cd [作成したwebappフォルダのフルパス]
pyenv virtualenv 3.9.0 webapp
pyenv local webapp
python -m pip install [必要なライブラリ]
python -m pip freeze -l > requirements.txt

<Python3.8.5でも同様の仮想環境を作る場合>

cd [作成したwebapp-3.8.5フォルダのフルパス]
pyenv virtualenv 3.8.5 webapp-3.8.5
pyenv local webapp-3.8.5
python -m pip install -r requirements.txt

[Python] 208 pyenvでtkinter8.6を使えるようにする

[macOS 10.15 Catalina]

macOSではtkinter8.5がデフォルトのようなので別途設定しました。

1. tcl-tkをインストールする。

brew install tcl-tk

2. tcl-tkのバージョンが8.6であることを確認する。

brew info tcl-tk

brew(醸造)だからbottledされたパッケージはcellar(貯蔵庫)に保管とはしゃれてますね。

tcl-tk: stable 8.6.10 (bottled) [keg-only]
Tool Command Language
https://www.tcl-lang.org
/usr/local/Cellar/tcl-tk/8.6.10 (3,036 files, 51MB)

3. bash_profileに以下を追記する。

export PATH="/usr/local/opt/tcl-tk/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"

4. pyenvにPython3.9.0を上書きインストールする。

PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'" pyenv install 3.9.0

私の場合はPyInstallerにも対応しなければならず、オプションを一つ追加します。

PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6' --enable-shared" pyenv install 3.9.0

5. 確認のためtkinterを起動する。

python -m tkinter

[Python] 207 PyInstallerのインストールに関するトラブル

[macOS 10.15 Catalina]

色々トラブったので備忘のためにメモ書きしておきます。

ちなみにPythonはpyenvで複数バージョンを管理しています。

PyInstallerのインストール

python -m pip install PyInstaller

うまくいかない場合はpyenvのPythonをoption付きで上書きインストール。

PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.0

以下コマンドでexeファイル作成。–onefileで一つの実行ファイルにまとめます。–noconsoleでコンソールなしの実行ファイルも作成します。pyinstallerではなく大文字入りのPyInstallerなのでご注意下さい。

python -m PyInstaller json_csv.py --onefile --noconsole

実はPython3.9.0の上書きインストールによりtkinterが8.6から8.5にダウングレードされてGUIのボタンの色がおかしくなるなどの不具合が発生しました。

以前pyenvでtkinter8.6が使えないためoption付きでPython3.9.0をインストールしたことをすっかり忘れていたのです。

これについては別記事に書きます。

[Python] 206 JSON CSV相互コンバータのexe化

どうせなら相互に変換できるツールの方が便利だろうと考え、前回のコードに加筆しました。

CSVファイルはExcelで開くため文字コードはshift-JIS、JSONファイルはVScodeなのでUTF-8とややこしめです。

ファイルパスの拡張子で変換方法を判断します。

# 途中から

if '.json' in path:
    # JSONファイルをデータフレームとして読み込む
    df = pd.read_json(path,lines=True)

    # 変換先のCSVファイル名を作成する
    csv_file = path.split('.')[0] + '.csv'

    # データフレームをCSVファイルに変換する
    df.to_csv(csv_file, encoding='Shift_JIS')

elif '.csv' in path:
    # shift-JISからUTF-8への変換
    utf_file = path.split('.')[0] + '_utf' + '.csv'
    cmd = "nkf -w %s > %s" % (path, utf_file)
    subprocess.call(cmd, shell=True)

    # CSVファイルを辞書型として読み込み
    json_list = []
    with open(utf_file,'r') as f:
        reader = csv.DictReader(f)
        for row in reader:
            json_list.append(row)

    # 変換先のJSONファイル名を作成する
    json_file = path.split('.')[0] + '.json'

    # JSONファイル作成
    with codecs.open(json_file, 'w','utf-8') as f:
        json.dump(json_list,f,ensure_ascii=False)

root.mainloop()

[Python] 205 JSON to CSVコンバータのexe化

使用頻度の高いコードはPyInstallerでexe化してツールにすることにしました。

これをマイアプリとしてアプリケーションフォルダにまとめておきます。

以下のコードでJSONファイルをCSVファイルに変換して同じフォルダに置きます。

起動に10秒程度かかりますが、とりあえず良しとします。

import pandas as pd
import sys,json
import tkinter as tk
import tkinter.font as font
from tkinter import StringVar
from tkinter import ttk

root = tk.Tk()
root.title("JSON_CSV_CONVERTER")
root.geometry("300x50")
root.configure(bg='#40E0D0')

# フォント設定
my_font = font.Font(root,family="System",size=18,weight="normal")

# フレームの作成・配置
frame = tk.Frame(root,background = '#40E0D0')
frame.grid(row=0,column=0, sticky=tk.NSEW, padx=5, pady=10)

# ラベルの作成・配置
label = tk.Label(frame,text='PATH',background = '#40E0D0',foreground = '#8b0000',font=my_font)
label.grid(row=0, column=0)

# パス入力エントリの作成・配置
entry = tk.Entry(frame,width=15,background = '#98fb98',foreground = '#8b0000',font=my_font)
entry.grid(row=0,column=1)

# 実行ボタンの配置
var_act = tk.IntVar()
act_btn = tk.Button(frame, text="実行",command= lambda:var_act.set(1),width=2,font=my_font)
act_btn.grid(row=0,column=2,padx=2)

# ファイルパスの入力を待機
act_btn.wait_variable(var_act)

# 入力したファイルパスを取得
path = entry.get()

# JSONファイルをデータフレームとして読み込む
df = pd.read_json(path,lines=True)

# 変換先のCSVファイル名を作成する
csv_file = path.split('.')[0] + '.csv'

# データフレームをCSVファイルに変換する
df.to_csv(csv_file, encoding='Shift_JIS')

root.mainloop()