【Python】よく使うライブラリ・コード

# 設定ファイルとしてjsonを使用する
```python:python
import json

settings = json.load(open('settings.json', encoding='utf8'))
print(settings['key1'])
```

```settings.json
{
    "key1" : "value1",
    "key2" : "value2"
}
```

# txtファイル操作
入力データとしてtxtファイルを使用する（配列に格納）

```python:python
with open('file.txt', mode='r', encoding='utf-8') as f:
    file = f.read()

files = file.split('\n')
print(files)
```

出力データとしてtxtファイルを使用する

```python:python
with open(filepath, mode='a', encoding='utf-8') as f:
    f.write('文字列\n')
```

# ファイル操作
ファイルのコピー

```python:python
import shutil

shutil.copy2(path_src, path_dist)
```

# 日付取得
```python:python
import datetime

now = datetime.datetime.now()
now_disp = now.strftime('%Y%m%d%H%M%S')
```

# ディレクトリのファイル一覧を取得（配列）
```python:python
file_list = os.listdir(path=filepath)

# 上記で取得したファイルの配列から、特定文字が含まれるファイルを抜粋
file_list_unique = [s for s in file_list if '指定文字列' in s]
```

# webスクレイピング
```terminal:terminal
pip install requests bs4
```

```python:python
import requests
from bs4 import BeautifulSoup

url = 'website.com'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
# soup = BeautifulSoup(response.content, 'lxml')
# soup = BeautifulSoup(response.content, 'html5lib')

# エンコードサンプル
soup = BeautifulSoup(response.content, 'html.parser', from_encoding='shift-jis')


# 単体取得
print(soup.select_one('.css-selector').text) # 文字列を取得する
print(soup.select_one('.css-selector').attrs['href']) # 属性の値を取得する

# 複数ある場合は`select`で取得してforで回す
htmls = soup.select('.css-selector')
for html in htmls:
    print(html.select_one('.css-selector').text)

```

## ログイン（セッション保持）
```python:python
session = requests.Session()

data_login = {
    'propaty': 'value'
}
session.post(url_action, data=data_login)

result = session.get(url_result)
soup_result = BeautifulSoup(result.content, 'html.parser')
```

# エクセル操作
## openpyxl
```terminal:terminal
pip install openpyxl
```

```python:python
import openpyxl

# エクセルの読み込み
wb = openpyxl.load_workbook(filepath)
ws = wb['シート名']

# エクセルの新規作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = 'SheetName'


# 特定のセルの値を取得（A1がrow=1, column=1）
cell_obj = ws.cell(row=1, column=1).value

# 特定のセルに値を入力
ws.cell(row=1, column=1).value = '値'

# 特定の列の値を全て取得（※注意：配列のインデックスは0がA列）
for cell_obj in list(ws.columns)[0]:
    print(cell_obj.value)

# 特定の行の値を全て取得（※注意：配列のインデックスは0がA列）
for cell_obj in list(ws.rows)[0]:
    print(cell_obj.value)

# シート保存
wb.save(filepath)
```

## xlwt
```
import xlwt
 
# bookを作成
book=xlwt.Workbook()
sheet1=book.add_sheet('sheet1')
 
# write(行番号, 列番号, 値)
 
# 2行目A列に値を挿入
sheet1.write(1, 0,'hoge')
 
# B列1～2行目に値を挿入
sheet1.write(0, 1,10)
sheet1.write(1, 1,10)
 
# B列3行名に関数を挿入
sheet1.write(2, 1, xlwt.Formula('sum(B1:B2)'))
 
# bookを保存
book.save('hoge.xls')
```

# ブラウザ自動操作
chromedriverをダウンロードし、プロジェクト直下に配置
https://chromedriver.chromium.org/downloads

```terminal:terminal
pip install selenium pyperclip
```

```python:python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
import pyperclip

# Driver設定
DRIVER_PATH = './chromedriver'
IMPLICITLY_INTERVAL = 10
options = Options()
# options.add_argument('--headless')
# options.add_argument('--window-size=1600,900')
driver_service = fs.Service(executable_path=DRIVER_PATH)
browser = webdriver.Chrome(service=driver_service, options=options)
browser.implicitly_wait(IMPLICITLY_INTERVAL)

# ChromeDriver操作
## 引数URLを表示
browser.get('https://www.google.com/')

## htmlの取得（--headlessでも可能）
html = browser.page_source
print(html)

## セレクタ指定方法（単体）
element = browser.find_element(By.CSS_SELECTOR, '.selector')
element = browser.find_element(By.CLASS_NAME, 'selector')
element = browser.find_element(By.TAG_NAME, 'div')

## セレクタ指定方法（複数）
elements = browser.find_elements(By.CSS_SELECTOR, '.selector')

## 指定セレクタの属性の値を取得
element.get_attribute('href')

## 指定セレクタをクリック
browser.find_element(By.CSS_SELECTOR, '.selector').click()

## 文字の入力（send_keysだと遅いため、pyperclipで文字列をコピーした状態にして貼り付ける）
pyperclip.copy('入力したい文字列')
browser.find_element(By.CSS_SELECTOR, '.selector').send_keys(Keys.CONTROL, 'v')

## セレクトボックスの選択
selectbox = browser.find_element(By.CSS_SELECTOR, '.selector')
select = Select(selectbox)

### 選択方法
select.select_by_index(2)  # 3番目のoptionタグを選択状態に
select.select_by_index(len(select.options)-1)  # 最後のoptionタグを選択状態に
select.select_by_value('3') # valueが"3"のoptionタグを選択状態にする
select.select_by_visible_text('3番目') # オプションタグの中身が"3番目"と表示されたoptionタグを選択状態にする

## Javascript実行（例：指定セレクタのdisplayプロパティをnoneにする）
browser.execute_script('document.querySelector(".css-selector").style.display="none";')

## ChromeDriverを終了
browser.quit()
```
その他セレクトボックス参考（ https://yuki.world/selenium-select/ ）


# 実行ファイル化する
```terminal:terminal
pip install pyinstaller
```

```terminal:terminal
pyinstaller filename.py

pyinstaller filename.py --onefile # 1つの.exeファイルにまとめる
pyinstaller filename.py --noconsole # .exe実行時にコンソールを表示しない
pyinstaller filename.py --onefile --noconsole # 上記両方
```

# 定期実行
```terminal:terminal
pip install schedule
```


```python:python
import schedule
import time

# 実行job関数
def job():
    print("job実行")


#1分毎のjob実行を登録
schedule.every(1).minutes.do(job)

#1時間毎のjob実行を登録
schedule.every(1).hours.do(job)

#AM11:00のjob実行を登録
schedule.every().day.at("11:00").do(job)

#日曜日のjob実行を登録
schedule.every().sunday.do(job)

#水曜日13:15のjob実行を登録
schedule.every().wednesday.at("13:15").do(job)

# jobの実行監視、指定時間になったらjob関数を実行
while True:
    schedule.run_pending()
    time.sleep(1)
```

# ロリポップサーバーでPythonを使う
ロリポップで「スタンダードプラン」以上を契約する。（SSH接続が必要になるため）
管理画面メニュー「サーバーの管理・設定」内の「SSH」を選択し、SSHを有効にする。
表示された接続情報を使い、SSH接続を行う。（RLogin等）

## pip導入
```terminal:terminal
# バージョンの確認
python3 --version

# pipの導入
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --user
```

## PATHを通す
```terminal:terminal
# パスを通す
pwd
→　/home/users/番号/ユーザー名
次に、PATHを通すのに、.bash_profileを作成します。
vi .bash_profile
```

### 「.bash_profile」を作成
vi操作：「i」で挿入モード、「:wq」で書き込み終了。

```terminal:.bash_profile
PATH=$PATH:/home/users/番号/ユーザー名/.local/bin
export PATH
```

```terminal:terminal
source .bash_profile
```

### 確認＆インストール
```terminal:terminal
pip3 list

pip3 install requests
```

### cron（定期実行）する場合
以下の２行を、プログラムの先頭行に入れる

```python:python
#!/usr/local/bin/python3.7
# coding:utf-8
```
上記の`python3.7`はその時のバージョンによるので、
SSHから`cd /usr/local/bin/`で階層を移動してバージョンを確認して行う。

また、プログラム内のパスの記述は相対パスは使えないので注意。（ルートパスか、絶対パス）
ルートパス例：/home/users/1/itigo.jp-balita2981/web/file.txt

https://chat.openai.com/share/d754dcfb-5be8-437e-b268-d6bc47f241b6