komekichix’s diary

日々の仕事、生活でぶち当たった問題の解決策を書き残しています。あなたのお役に立てれば幸いです。

【Python】selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.

JupyterLabで作成したプログラムを.pyに変換して実行すると、webdriver.Chrome()のところで下記のエラーが出ました。

...
FileNotFoundError: [Errno 2] No such file or directory: 'chromedriver'
...
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

ソースはこんな感じ。

from selenium import webdriver
# GoogleChromeを起動
browser = webdriver.Chrome() # for Mac

seleniumのバージョンアップ(pip install --upgrade selenium)や
chromedriverのバージョンアップ(pip install chromedriver_binary==101.0.4951.41)
を試すも解消せず。
更には、 $ ps -ef | grep chrome
kill プロセスID も試みるも一向に解消しない。

でもでも、
import chromedriver_binary
を足したら動作しました。

import chromedriver_binary   # <-- add
from selenium import webdriver
# GoogleChromeを起動
browser = webdriver.Chrome() # for Mac


JupyterLabでは無くても動作したので気づきませんでした。。。

以上です。

【Python】Pythonのデータ型 リスト型

基本型
    spam = ['cat', 'bat', 'rat', 'elephant']
    spam[1] -> ‘bat’

多次元
    spam = [['cat', 'bat'], [10, 20, 30, 40, 50]]
    spam[0] -> ['cat', 'bat']
    spam[1][4] -> 50

■後ろからの参照
    spam = ['cat', 'bat', 'rat', 'elephant']
    spam[-2] -> 'rat'

    spam = [['cat', 'bat'], [10, 20, 30, 40, 50]]
    spam[-1][-2] -> 40

■リストの一部分を取得(スライス)
    第1インデックスから第2インデックス−1までが取り出される。
    spam = ['cat', 'bat', 'rat', 'elephant']
    spam[1:3] -> ['bat', 'rat']

    インデックスの省略も可能。
    spam[1:] -> ['bat', 'rat', 'elephant']
    spam[:3] -> ['cat', 'bat', 'rat']
    spam[:5] -> ['cat', 'bat', 'rat', 'elephant'     範囲外でもエラーにならない

■リストの長さを求める
    spam = ['cat', 'bat', 'rat', 'elephant']
    len(spam) -> 4

■リストの連結
    spam=[1, 2, 3]
    spam = spam + ['a', 'b', 'c']
    spam -> [1, 2, 3, 'a', 'b', 'c']

■リストからの削除
    spam = ['cat', 'bat', 'rat', 'elephant']
    del spam[1]
    spam -> ['cat', 'rat', 'elephant']

■リスト内の検索
    spam = ['cat', 'bat', 'rat', 'elephant']
    'rat' in spam -> True
    spam.index('bat') -> 1

■複数変数への一括代入
    spam = ['cat', 'bat', 'rat', 'elephant']
    a,b,c,d = spam
    print(a, b, c, d) -> cat bat rat elephant

■リストへの挿入、削除
    spam = ['cat', 'bat', 'rat', 'elephant']
    spam.insert(1, 'dog')
    spam -> ['cat', 'dog', 'bat', 'rat', 'elephant']

    spam.remove('dog') 
    spam -> ['cat', 'bat', 'rat', 'elephant']
        複数ある場合は最初の1つだけ削除される。
        全て削除は、
        while ‘dog’ in spam: spam.remoe(‘dog’)

■リストのソート
    spam = ['cat', 'bat', 'rat', 'elephant']
    spam.sort()
    spam -> ['bat', 'cat', 'elephant', 'rat']

    降順
    spam.sort(reverse=True)
    spam -> ['rat', 'elephant', 'cat', 'bat']

 

【Python】UnicodeEncodeError: 'cp932' codec can't encode character

Windowspythonでprint関数を使用すると、 UnicodeEncodeError: 'cp932' codec can't encode character が発生することがあります。
理由と対処法を以下に記します。

Pythonでは文字列はUTF-8で処理されます。
一方、Windowsでは標準出力へはCP932(シフトJISコード)で処理されます。
このため、CP932に変換出来ない文字コードに対しては、UnicodeEncodeError例外が発生するのです。

以下のようにしておくとCP932に存在しない文字は、'?'に置き換わるとともにエラーを回避できます。
b = a.encode('cp932', 'replace')
print(b.decode('cp932'))


下記のサイトにお世話になりました。ありがとうございます。
(Windows) Python3でのUnicodeEncodeErrorの原因と回避方法 - Qiita
https://qiita.com/butada/items/33db39ced989c2ebf644

 

【Python】オフラインでpyinstallerを導入する際の注意点

オフライン環境上でPyInstallerの導入に手こずったので対処方法を記録しておきます。

■ pyinstallerが実行できない

  pip install --no-deps pyinstaller-4.9-py3-none-win_amd64.whl
  としてpyinstallerをインストールします。
  ところが、コマンドプロンプトからpyinstallerコマンドを入力しても認識されません。
  
  ・原因と対処
   Microsoft storeからインストールしたpythonだとインストール先が異なるためかPyinstallerのインストールがうまくいかないようです。
  アンインストールしてから、正規のインストーラhttps://www.python.org/からダウンロードしてインストールし直します。

■ pyinstallerでエラーとなる

  pyinstaller xxxxx.py --onefile でエラーが発生する場合。

  ・Please install PyWin32 or pywin32-ctypes

   https://pypi.org/project/pywin32-ctypes/#files から
   pywin32_ctypes-0.2.0-py2.py3-none-any.whl をダウンロードします。
   pip install --no-deps pywin32_ctypes-0.2.0-py2.py3-none-any.whl としてインストールします。

  ・No module named altgraph

   https://pypi.org/project/altgraph/#files から
   altgraph-0.17.2-py2.py3-none-any.whl をダウンロードします。
   pip install --no-deps altgraph-0.17.2-py2.py3-none-any.whl としてインストールします。

  ・No module named pefile
   https://pypi.org/project/pefile/#files から
   pefile-2021.9.3.tar.gzをダウンロード をダウンロードします。
   pip install --no-deps pefile-2021.9.3.tar.gz としてインストールします。


こちらのサイトにお世話になりました。ありがとうございます。
オフライン環境でPyInstallerをインストールする為のTips | msk-works
https://msk-works.netlify.app/pyinstaller/

【PyInstaller】インストールしてもpyinstaller がコマンドとして認識されない問題【解決】 - Just beat IT (hatenablog.com)
https://lhopital.hatenablog.com/entry/2020/11/07/044419

 

以上です。

 

【Mac】Macでスクリーンショットをとる方法

1.画面全体

 shiftキー + commandキー + 3(#)キー
  →画面隅に小さく表示されるのでクリックする。
  →編集モードになるので好きなだけ編集して保存。

2.画面の一部

 shiftキー + commandキー + 4($)キー
  →マウスカーソルが範囲選択カーソルに変わる。範囲選択する。
  →画面隅に小さく表示されるのでクリックする。
  →編集モードになるので好きなだけ編集して保存。

3.ウィンドウ単位で取得

 shiftキー + commandキー + 4($)キー + スペースキー
  →マウスカーソルが選択カーソルに変わる。対象のウィンドウを選ぶ。
  →画面隅に小さく表示されるのでクリックする。
  →編集モードになるので好きなだけ編集して保存。
  ※他のウィンドウで隠れた部分、画面からはみ出した部分も取得してくれる。

4.スクリーンショット保存先の変更

 通常はデスクトップに保存される。
 スクリーンショットツールで保存先の変更が可能。

 shiftキー + commandキー + 5(%)キー + スペースキー
  →「オプション」から保存先を選択する。
  ※オプションでは5秒、10秒のタイマー指定も可能。

 

正規表現を使ってテキストファイル内の数値を0埋めして桁数を揃える方法

テキストファイル内の数値を0埋め(ゼロパディング)して任意の桁数に揃えたいことがあったので、やり方を書いておきます。
まずは、テキストエディタ正規表現を使って置換を行う方法。
その後に、コマンド(sed)を使った方法も載せておきます。
そして、応用編として時間表記の0埋めも考えてみました。

1.テキストエディタで0埋めしてみる

 123
 0045
 10

などを前ゼロ埋め5桁に変換したい場合のやり方。
2段階に分けて置換を行います。

(1)数字の前に0を入れて桁を増やす

 テキストエディタの置換機能を使って数字の前に揃えたい桁数以上の0を挿入します。

 置換前 ([0-9]+)
 置換後 00000$1
  ↓
 00000123
 000000045
 0000010

()はグループを表します。複数使用した場合は先頭から順に、$1$2$3...で利用できます。
秀丸では¥1¥2¥3...と¥文字を使います。
各エディタとも「正規表現」をオンにするのを忘れずに。

サクラエディタの場合
秀丸エディタの場合
Atomエディタの場合

 

(2)必要な桁数以上を削除する

 揃えたい桁数だけを残します。

 置換前 (0*)([0-9]{5})  ・・5桁残したい場合は{5}とします。
 置換後 $2
  ↓
 00123
 00045
 00010

サクラエディタの場合
秀丸エディタの場合
Atomエディタの場合

 

2.sedコマンドで0埋めしてみる

 sedコマンドを使えば、もっと楽に一気に変換出来ます。

 cat test.txt | sed -E "s/([0-9]+)/00000\1/g" | sed -E "s/(0*)([0-9]{5})/\2/g"
  ↓
 00123
 00045
 00010

 \はエスケープ文字です。バックスラッシュか¥マークを使います。

3.時刻表示への応用

 応用として時刻の0埋めも可能です。

  1:14
  17:13
  9:03

 時刻に前ゼロをつけて桁を合わせたい場合のやり方。
 2段階に分けて置換を行います。

(1)置換で時刻の先頭に0を入れます。

 置換前 ([0-9]+):([0-9][0-9])
 置換後 0$1:$2
 ↓
 01:14
 017:13
 09:03

(2)「:」の左2文字だけを残します。
 置換前 (0*)([0-9][0-9]):([0-9][0-9])
 置換後 $2:$3
 ↓
 01:14
 17:13
 09:03

 

 

以上です。