[Python] 214 CSVファイルの空白行を削除する

CSVファイルに空白行がありこれらを削除したい場合、データフレームからの偶数行抽出などではうまくいきません。

CSVファイルをCSVモジュールで読み込み、if文で空白行以外を抽出しながら書き込みをします。

import glob,csv

# 1986年から1990年のレースファイルから空白行を削除したCSVファイルを作成する。/年/競馬場コード/回/*.csv
for year in range(1986,1991,1):
    for f in glob.glob(f'/horse_racing/race_mas/{year}/*/*/*.csv', recursive=True):
        file_new = f.split('race_mas/')[0] + 'race/' + f.split('race_mas/')[1]

        with open (f, mode="r", encoding="shift_jis") as f1:
            with open(file_new, mode="w", encoding="shift_jis") as f2:
                writer = csv.writer(f2)
                for row in csv.reader(f1):
                    if any(row):
                        writer.writerow(row)

[Python] 213 MySQL 02 CSVファイルをインポートする

前回はphpMyAdminを使ってインポートしましたが、今回はPythonでやってみました。

プログラムとデータベースの融通の効かなさが合わさって、正直言ってこの程度のコードでも頭にダメージを受けました。

随所にprint文を入れているところに苦闘の跡がうかがえます。Microsoft Accessで苦労していた頃を思い出します。

書き上げればあとは楽なんでしょうが、そこまでたどり着けるのか自信がありません。

import csv,mysql.connector
import pandas as pd

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

# DB化するCSVファイルの名前
filename = 'race202001010102.csv'

# CSVファイルのタイトル行の内容とtypeをリストにする
df = pd.read_csv(filename, encoding='Shift-JIS',header = None)
column_title = list(df.loc[0])
column_title_type_pre = [type(l) for l in df.loc[1]]

# typeは全て20字以内の文字列とする
# column_title_type = ['varchar(20)']*len(column_title)でも可
column_title_type = []
for t in column_title_type_pre:
    if 'str' in str(t):
        column_title_type.append('varchar(20)')
    if 'float' in str(t):
        column_title_type.append('varchar(20)')

print(column_title)
print(column_title_type)

# SQL文に使う列タイトルの文字列を作成する(角括弧を丸括弧に置換えるなど)
column_l = []
for ti,ty in zip(column_title,column_title_type):
    column = ti + ' ' + str(ty)
    column_l.append(column)

print(column_l)

column_l_str = str(column_l).replace('[','(').replace(']',')').replace("'",'').replace('(万円)','')

print(column_l_str)

# mysqlに接続
conn = mysql.connector.connect(**config)
cur = conn.cursor()

# データベースhorse_racingにtable_testを作成する
sql = f"create table horse_racing.table_test {column_l_str}"
cur.execute(sql)
cur.execute('begin')

# CSVファイルを読み込み、各行をtableに挿入する
with open(filename, 'rt', encoding='Shift-JIS') as f:
    reader = csv.reader(f)
    for i,row in enumerate(reader):
        print(f'row {row}')
        if i != 0:
        row_str = str(row).replace('[','(').replace(']',')')
            print(row_str)
            sql = f'insert into horse_racing.table_test values {row_str}'
            cur.execute(sql)

cur.execute('commit')
conn.close()

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

[WordPress] 03 Highlighting Code Blockのマージン調整

Highlighting Code Blockプラグインを使うとコードを見やすく表示できますが、トップのマージンを除去したくなる時があります。

方法を以下に記します。

追加CSSでプラグイン表示に限らず段落や画像のマージンを調整できます。

1. Chromeの検証機能でマージンの素性を確認。上部の段落ではなくコードブロックのマージンであることがわかる。

2. コードブロックの”高度な設定”で追加CSSクラスに適当な名前をつける。

3.外観のカスタマイズで追加CSSを作成する。”.example_code{margin-top:0;}”などと記入する。

[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

[WordPress] 02 MAMPにインストールする

[WordPress 5.7]

MAMPでWordPressをローカル開発する環境を作りました。

ブログデータのエクスポート・インポートを使った引っ越しの予行演習を兼ねています。

参考にしたネット記事の方法では、ブログのタイトル、本文、日時、追加CSSは移すことができました。ウィジェットやプラグインはこの方法だけではできませんでしたが、私にはこれで十分です。

ブラウザのブックマークを扱うように簡単にデータを動かせるとは知りませんでした。

参考記事

[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をインストールしたことをすっかり忘れていたのです。

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