python弄ってた時に出たエラー

#メモ代わり
これからpython弄ってくしそのメモとして
都度都度追記してく
(8/22追記)
かなり多くなってきたのでselenium関連は別で分けるか検討中

### SyntaxError: Non-UTF-8 code starting
<b>エラーメッセージ</b>
SyntaxError: Non-UTF-8 code starting with 'エラー個所' in file sample.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
<b>原因</b>
書いてたpythonのコードがS-JIS(SHIFT-JIS)で書かれてたことが原因(要は***文字コード***)
手順：[新規作成]→[テキスト ドキュメント]→出来たファイルの拡張子をtxtからpyに変更
<b>オチ</b>
pythonのソースコードをS-JISからUTF-8に変更
terapadの場合：一度コード全文をコピー→[ファイル]→[文字コードしてい再読み込み]→UTF-8を選択→(再読み込み後)ctrl+Aで全文選択→ctrl+Vで貼り付け→ctrl+Sで上書き保存
<font size="1">
htmlでも文字化けされまくったし、やはりS-JISは害悪･･･我らがUTF-8神の元に統一しなきゃ･･･(UTF-8教過激派)
</font>
### FileNotFoundError
<b>エラーメッセージ</b>
FileNotFoundError: [Errno 2] No such file or directory: './img.png'
<b>原因</b>
「img.png」なんてファイルが指定しているフォルダ(ディレクトリ)存在しないことが原因
→間違えてimg.jpgを入れてた
<b>オチ</b>
ファイル[img.jpg]を[img.png]にするか、コード中のimg.pngをimg.jpgにするかのどちらか
### その3(selenium関連)
<b>エラーメッセージ</b>
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 81
<b>原因</b>
オトしてきたchromedriver.exeとPCに入っているGoogle chromeのバージョンが違う
→ChromeDriver 81.0.4044.20に対してchromeのバージョンは80.0.3987.132だった
→ちなみにchromeのバージョン確認の仕方は「右上の：」→「ヘルプ」→「Google Chromeについて」で遷移する画面で分かる
<b>オチ</b>
バージョンは80.0.3987.132に対応するchromedriver.exeをオトしてきた
### IndentationError
<b>エラーメッセージ</b>
File "python.py", line 52
～
IndentationError: expected an indented block
<b>原因</b>
該当箇所(今回は52行目)にインテント(字下げ)が入っていない
<b>オチ</b>
Tabキーでインテントを入れて対応
→ちなみに半角スペースでも可(全角はダメ)
### UnicodeDecodeError
<b>エラーメッセージ</b>
UnicodeDecodeError: 'cp932' codec can't decode byte 0x86 in position 49: illegal multibyte sequence
該当箇所(49行目)：
with open("img.txt") as f:
<b>原因</b>
どうやら文字コードの問題のようで
このimg.txtはUTF-8で書かれてるんだけれども、Windows環境だと指定がないとS-JISで読み込もうとするためとのこと
参考：https://qiita.com/Yuu94/items/9ffdfcb2c26d6b33792e
<font size="1">
やはりS-JISは害悪･･･(UTF-8教過激派)
</font>
<b>オチ</b>
openの中を以下のように書き換えたらいけた
前）with open("img.txt") as f:
後）with open("img.txt",encoding="utf8") as f:
### SyntaxError: EOL while scanning string literal
<b>エラーメッセージ</b>
print("/、\")
SyntaxError: EOL while scanning string literal
<b>原因</b>
”や'が閉じられていないことが原因とのこと
例文だと閉じられているように見えるが実は<b>「\」はエスケープ文字</b>で『「\"」は"を文字として出す』という処理になってしまう
参考：https://blog.pyq.jp/entry/Python_kaiketsu_181122
<b>オチ</b>
「\\\」というように連続して書く

### SyntaxError: Failed to execute 'evaluate' on 'Document'
<b>エラーメッセージ</b>※＠はリンクになってしまうので全角
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//input[＠name='name]' is not a valid XPath expression.
該当箇所：
driver.find_element_by_xpath("//input[＠name='name]").send_keys("")
<b>原因</b>
"や'が閉じられていないというエラー
<b>オチ</b>
該当文をよく見ると『"//input[＠name='name<font color="red"><b>'</b></font>]"』と色付き部分にあるべき「'」がないので、付けた
動いた

### SyntaxError: (unicode error)
<b>エラーメッセージ</b>

```py:selenium_test.py
  File "selenium_test.py", line 12
    prefs = {"download.default_directory" : "C:\Users\\{username}\\Downloads\\test"}
                                            ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

```
<b>原因</b>
以下の参考URLのソースコードを参考にしてたがエラー
生データを表すrを入れなければならんとのこと
参考：https://qiita.com/hikoalpha/items/fa8330391823aea2fbca
<b>オチ</b>
<b>正</b>)prefs = {"download.default_directory" : <b><font color="red">r</b></font>"C:\Users\\{username}\\Downloads\\test"}
誤)prefs = {"download.default_directory" : "C:\Users\\{username}\\Downloads\\test"}
誤)prefs = {"download.default_directory" : <font color="red">ex(r</font>"C:\Users\\{username}\\Downloads\\test"<font color="red">)</font>}
<font color="white">載せてくださるのは非常にありがたいのだが、エラーを吐くコードそのままにされるのと間違いを誘発しそうな記述はちょっと･･･</font>
### SyntaxError: invalid character in identifier
<b>エラーメッセージ</b>

```py:test.py
   while　x < xx:
          ^
SyntaxError: invalid character in identifier
```
<b>原因</b>
whileとxの間に<b>全角スペース</b>が入っている
<b>オチ</b>
半角スペースに書き換えた

### element not interactable(selenium関連)
<b>エラーメッセージ</b>

```py:selenium_test.py
  File "selenium_test.py", line 33, in <module>
    driver.find_element_by_xpath("//button[@class='class']").click()
～中略～
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

```
<b>原因</b>
同じ要素(class要素が"class"のボタン)のボタンが実は複数あった
画面外にあったりする場合もこのエラーを吐かれたりするそうだが、その時はスクロールすればいいとのこと
参考：https://qiita.com/DNA1980/items/528ff6269986b262acdc
<b>オチ</b>
find_elementsで要素が合致する全てのbuttonを吐き出させて、目的のボタンを探し出して.click()した
<b>おまけ</b>
ボクがよく使う属性確認コード

```py:selenium_test.py
for tag in driver.find_elements_by_xpath("//button[@class='class']"):#xpath内は必要に応じて改変
#	att = tag.get_attribute("name") #この部分は引っかかったパーツの特定の部分を引っ張り出したいときに使う→この場合はclassが"class"のボタンのname要素を引っ張ってくる
	print("テスト：" + tag.text)#上のattを表示させたい場合は『print("テスト：" + att)』となる
```
### element is not attached to the page document
<b>エラーメッセージ</b>

```py:selenium_test.py
  File "selenium_test.py", line 33, in <module>
    print("テスト："+ele_find.text)
～中略～
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
```

<b>原因</b>
for文内で遷移する処理を入れていたがbreakの記述忘れた
そのために、処理が継続していたが存在しない要素を取ろうとして「そんなモンはねえ！」と怒られたのだと思う
<b>オチ</b>
遷移処理直後にbreakをねじ込んだ

### FileNotFoundError: [WinError 3] 指定されたパスが見つかりません
<b>エラーメッセージ</b>

```py:test.py
os.mkdir("パス//test//test2")
```
<b>原因</b>
test2をtestに作りたいのだが、肝心のtestディレクトリが存在しなかった
<b>オチ</b>

```py:test.py
os.makedirs("パス//test//test2") #makedirsでまとめて作っちゃえば良い
```
### pyautoguiで設定した文字が大文字になる
<b>状況</b>

```py:test.py
pyautogui.typewrite("puyopuyo")#結果→PUYOPUYO
```
<b>原因</b>
Shift+CapsLockで大文字入力モードにしてた
「キーを入力」ではなく、「キーを叩く」というコマンドだからだろうね
もっとも遭遇する機会は少ないだろうけど
<b>オチ</b>
大文字入力を解除したら行けた



### SyntaxError: invalid syntax
<b>原因</b>
クs…お排泄物みたいな構文エラーでよく出てくる
・if文やfor文やwhile文で最後に「:」を付け忘れた
誤)if a==0
正)if a==0 <b>:</b>

・何か不要な文字とか入ってる
大抵は指摘されてるのでそれを取っ払ってやるなり正しい形に書き直す

```py:selenium_test.py
  File "selenium_test.py", line 67
    ActionChains(driver).key_down(Keys.CONTROL).send_keys(,"s").perform()
                                                          ^
SyntaxError: invalid syntax
```

### AtomでFileNotFoundError: [Errno 2] No such file or directory:
<b>状況</b>
Atomでコーディング中、ファイルをopenしようとしたら発生。
<b>原因</b>
Atomのカレントディレクトリ(作業ディレクトリのこと)がコーディング対象のpytyonの場所でなかったため。
→別フォルダのpytyonコードを開いていたためと思われる。(真偽不明)

```py:Check_directory.py
import os
print(os.getcwd())#これで現在のカレントディレクトリを確認できる
```
<b>オチ</b>
しぶしぶ嫌々しょうがなく仕方なく不本意ながらディレクトリを変更するコードを入れた。
(追記)
pathlib使った方が楽ちんだと思ったので、そっちの書き方も追記。

```py:change_directory.py
import os
import pathlib
#ついでにディレクトリの書き方も記載。
os.chdir("C:\\hoge\\hage\\")#「\」を連続させることで「\」をテキストとして扱うことができる。
os.chdir("C:\hoge\hage\ ")#この書き方の場合、「\」はエスケープ文字だから最後の「\」と「"」がくっつかないように。
#また「\t」「\n」のような特殊文字が引っかかる場合があるので一番最初の\\を連続させる書き方の方が安全。
os.chdir("C:\hoge\hage")#この書き方でもOK。

#以下、pathlib使った書き方
here = pathlib.Path(__file__).parent#このchange_directory.py自身が存在しているディレクトリパスを取得
os.chdir(here)#カレントディレクトリを移動する
```

### exe化したコード実行時にFailed to execute scripy hogehoge
<b>状況</b>
コードをexe化した後に、そのexeを実行すると発生。
<b>原因</b>
その１.処理を終了させたい部分に書いていたexit()。
その２.相対バスで書いていたshutil.copy。
<b>オチ</b>
その１.exit()をsys.exit()に変更し再度exe化した。
その２.相対パスを絶対パス表記に変更した。
(追記)
が、ネットワーク上に置いたexeだとこのエラーを吐き出した。ナンデ？

```py:sample.py
#その１
import sys #sysのインポートも忘れずに
sys.exit() #コードを終了させる
#その２
import pathlib
import shutil
path = pathlib.WindowsPath(r"\\network\hoge\xxx.txt")
move_path = pathlib.WindowsPath(r"\\network\hoge\huga\xxx.txt")
shutil.copyfile(path,move_path)
```
### AtomでTabError: inconsistent use of tabs and spaces in indentation:
<b>状況</b>
Atomでコーディング後、実行したら発生。
<b>原因</b>
Atom上ではインデント(字下げまたは空白のこと)が確認できなかったが、元ファイルを開いてみるとインデントがスペース4つになっており、タブとスペースによるインデントが混在していた。
《エラーメッセージ》
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580375/cc3a6eaa-a29a-e341-6b2a-abdd5ece579f.png)
《Atom上のコード》
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580375/21e582f8-50d1-d99a-b45a-c0f71bb12fa3.png)

《元ファイルのコード》
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580375/73fd720b-ba83-e5df-62de-25513f2d8ac1.png)

<b>オチ</b>
元ファイルの方を直に修正した。
### Failed to execute script XX
<b>状況</b>
pyinstallerでexe化したプログラムを実行したら発生。
コード中のinput()に該当する箇所にてエラーが発生していた。
<b>原因</b>
exe化する際に付与したオプションの「--noconsole」。
<b>オチ</b>
今回はinput()を使わなくてもイケるので、input()部分を削除した。
もし使う場合は「--noconsole」を外してexe化をする。

### 'Alert' object is not callable(selenium関連)
<b>状況</b>
アラートダイアログ対策に入れていた部分を通過した際にメッセージで

```
DeprecationWarning: use driver.switch_to.alert instead
  driver.switch_to_alert().accept()
```
と言われたため、該当部分書き換えたら発生。
<b>原因</b>
不要な()を付けていた。

```py:sample.py
driver.switch_to.alert().accept()　#これはダメ
driver.switch_to.alert.accept()    #こっちが正解
```
<b>オチ</b>
正しい記述に修正。
余談ではあるが'Alert'に限らず<b>「XXX object is not callable」というエラーが出たら該当箇所に不要な()が付いていないか確認</b>するといい。
<font color="gray">(数時間前に.textを.text()って書いてしまっておんなじエラー文見てたはずなんだがなぁ･･･)</font>

### unsupported operand type(s) for %: 'WindowsPath' and 'tuple'
<b>状況</b>
ファイルをオトしてきて、先月と今月をファイル名に付けて保存先に移動をやろうとしたら発生。

```py:sample.py
from pathlib import Path
import datetime
from dateutil.relativedelta import relativedelta

save_path = Path(__file__).parent / "test"
today = datetime.datetime.now()
befor_month = today - relativedelta(months=1)
n_m = today.strftime("%Y%m") #今月
b_m = str(befor_month.strftime("%Y%m")) #先月
renamepath =save_path / "%s_%s.csv" %(b_m,n_m) #←この部分でエラー
```
<b>原因</b>
パスとタプル(複数の型がごっちゃになったヤツ)を結合しようとしたのが原因。
pathlibは「/」でパスや文字列を結合できるのだが、タプルはダメだった。
今の今までタプルも文字列だろと思ってたのも原因。
<b>オチ</b>
結合部分を修正した。

```py:resolve.py
#～略～
#案1 前に合わせて後ろをパスに変換する
renamepath =save_path / Path("%s_%s.csv" %(b_m,n_m))

#案2 全部タプルにしちゃう
renamepath ="%s/%s_%s.csv" %(save_path,b_m,n_m))　#「/」は「\\」でもOK

#案3 事前にタプルを変数に格納してただの文字列にして結合する
f_name = "%s_%s.csv" %(b_m,n_m)
renamepath =save_path / f_name
```

### ModuleNotFoundError: No module named 'dateutil'
<b>状況</b>
exe化したコードを実行しようとしたときに発生。
<b>原因</b>
exe化した環境に該当のモジュール(今回はdateutil)がインスコされてなかった。
<b>オチ</b>
インストールして再度exe化した。
なお今回のdateutilをインストールするコマンドは「pip install python-dateutil」なのでちょっと注意。

### unknown error: Chrome failed to start: exited normally.(Selenium)
<b>状況</b>
exe化したseleniumのコードを実行した際に発生。
以下がエラー文全体
```
Message: unknown error: Chrome failed to start: exited normally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location C:\Program Files (x86)\Google\Chrome\Application\chrome.exe is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
```
<b>原因</b>
詳しいことは分からなかったが、どうやらseleniumのheadlessオプション周りが悪さをしているらしい。
<b>オチ</b>
いっぱいあったオプションのうち「--disable-extensions」をコメントアウトしてみたところ動作した。
```
chromeoption.add_argument("--disable-extensions")
```
### Message: javascript error: arguments[0].click is not a function(Selenium)
<b>状況</b>
seleniumで取得した要素をクリックさせようとした際に発生。
該当のクリックは.click()ではなくjavascriptを実行させるコード。
```click.py
_ele = driver.find_elements(By.XPATH, "//div[@class='sample']")
driver.execute_script("arguments[0].click();", _ele)
```
<b>原因</b>
クリックする要素が正しい形でないからだろうと思われる。
よく見るとfind_element『s』と要素ではなく「配列」で取得するような形になっている。
<b>オチ</b>
driver.find_elementに修正した。

### pdf2image.exceptions.PDFPageCountError: Unable to get page count
<b>状況</b>
pdfを画像化するコードを実行した際に発生。
パスを何度も確認して修正したが一向に改善せず。
<b>原因</b>
変換元のpdfが良くなかった。
まともに開くことができなかった。
<b>オチ</b>
どうしようもないのでpdfをDLしなおした。

### [WinError 267] ディレクトリ名が無効です。
<b>状況</b>
shutil.rmtree実行時に発生。
<b>原因</b>
「ディレクトリ(フォルダ名)」ではなく「ファイル名」渡していた。
<b>オチ</b>
os.removeに変更。
「配下ごとフォルダを削除する」関数にファイル名渡しぁあそうなるよなぁ...。

### webdriver_manager使用時に503エラー(selenium関連)
<b>状況</b>
webdriver-managerを使用する行を実行時に発生。
seleniumが立ち上がる前にエラー落ちする。

```error.py
#該当箇所
driver = webdriver.Chrome(executable_path=chromedriver, chrome_options=chromeOptions)
```
```エラー内容.txt
selenium.common.exceptions.WebDriverException: Message: <HTML><TITLE>503サービス利用不可</TITLE>
<H1>503サービス利用不可</H1>
サーバへの接続に失敗しました<B>『ここにローカルホストのドメイン』</B></HTML>
```

<b>原因</b>
調べてみたものの不明。
後述の対応の結果からpythonのバージョンか？
<b>オチ</b>
<b>pythonのバージョンを変えた。</b>
またAnacondaでpythonのバージョンをいくつか用意して検証した。
<b>3.7</b>で正常動作を確認。
<b>3.8</b>と<b>3.9</b>ではエラーが発生。
(追記)
動作したものをpyinstallerでexe化したところ、まーた503エラーが発生。キレそう。

### ModuleNotFoundError: No module named 'msedge'(selenium関連)
<b>状況</b>
edgeをseleniumで操作するコードをpyinstallerでexe化し、それを実行したところ発生。

```error.py
#該当箇所
from msedge.selenium_tools import Edge
```
```エラー内容.txt
ModuleNotFoundError: No module named 'msedge'
```

<b>原因</b>
不明。
無論、pyinstallerを実行する環境でpipによるインストールは行っており、該当のコードも実行可能。
<b>オチ</b>
<b>.spec中の「hiddenimports」を書き換え、それによるexe化を実行した。</b>
最初にexe化した時に「.spec」ファイルが生成されていたため、それを書き換えて再度exe化処理をかけた。

```hoge.spec
～略～
a = Analysis(['hoge.py'],
             pathex=['（コードが置いてあるとこのパス）'],
             binaries=[],
             datas=[],
             hiddenimports=['c:\\users\\（見せられないよ！）\\appdata\\local\\programs\\python\\python38-32\\lib\\site-packages (3.141.4)'],             hookspath=[],
             runtime_hooks=[],
             excludes=['pandas', 'numpy'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
～略～
```

```実行コード.bat
pyinstaller hoge.spec
```

<b>参考</b>
https://ssrv.net/tech/python-pyinstaller-no-module/

### 正しくID指定をしているのに動かない(selenium関連)
<b>状況</b>
表示しているページに存在しているラジオボタンをID指定してクリックするよう記載したが、実行したところクリックされない事象が発生。
<b>原因</b>
通常考えられないことだが、<b>同じIDが同ページ上に複数存在(IDが重複)</b>していた。
要素を全取得＆len関数を掛けて発覚した。
```要素取得して個数取得.py
checktargets = driver.find_elements(By.ID,"ID名")
print(len(checkTarget))
```
<b>オチ</b>
for文で要素を回して何番目の要素が目的の動作をする確認し、配列にインデックスを記載した。
```動作を確認.py
checktargets = driver.find_elements(By.ID,"ID名")
for target in checktargets;
    #.click()でもいいけど画面外にあるとエラー吐くので、javascriptからクリックする下の書き方オヌヌメ
    #けど極稀に.click()でないと動作しない場合もあるから注意
    driver.execute_script("arguments[0].click();", target)
    input("動作を確認")
```
```動作記載.py
checktargets = driver.find_elements(By.ID,"ID名")
#今回は便宜上インデックスは1としている
driver.execute_script("arguments[0].click();", checktargets[1])
```
### exe化したプログラムが動かない(selenium関連)
<b>状況</b>
Chrome116にWebdriverManagerが対応していない問題を受けてselenium公式が実装したSelenium Manager対応版コードに書き換え＆pyinstallerでexe化した。
開発段階でコードから動くことは確認できていたにもかかわらず、exeを動かしたところ「seleniumにはPATHが必要」だの「114.0.5735.90(v115まではこれで動いてた)は今のChromeに対応してねーよ」だのエラーを吐かれた。
<b>原因</b>
pyinstallerが古いことが原因だった。何故古いと動かないのかは知らない。
<b>オチ</b>
pipからpyinstallerライブラリのアップデートをかけることで対応した。
作成したexeは問題なく動作した。
```アップデートコマンド
pip install --upgrade pyinstaller
```
```selenium.py
#ちなみにwebdriverを抜いた新しい書き方はこんな感じ
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chromeOptions.add_experimental_option('prefs', {'download.prompt_for_download': False})  # 都度保存先を確認しない
driver = webdriver.Chrome(options=chromeOptions)#ドライバーを作成
```

### pipから最新のライブラリをDLできない
<b>状況</b>
seleniumの開発時に古いバージョンだったので更新のために「pip install sekenium」を打ったが毎回同じバージョンがDLされて更新されなかった。
<b>原因</b>
キャッシュが悪さしていた。
<b>オチ</b>
pipのアップデートの際にキャッシュを使用しないことで対応した。
ChatGPTサマサマだなあ。
```アップデートコマンド
pip install ライブラリ名 --upgrade --no-cache-dir
```