Python

break : ループを止める。

【Python入門】breakを使ってループを止める方法とは? | プログラミング教育ナビ (programming-study.com)

指定範囲の文字列を取得

Python | スライスを使って文字列の指定範囲の部分文字列を取得する (javadrive.jp)

str = "Flower"

print(str[1:4])
>> low

print(str[2:6])
>> ower

#末尾を指定
print(str[-5:-1])

float(), int() : 文字列の数値化

Pythonで数字の文字列strを数値int, floatに変換 | note.nkmk.me

def act():
    select()
    kankaku=float(txtBox.get())
    #kankaku=float(kotae)
    print("kotae ",kankaku)
    schedule.every(kankaku).minutes.do(job)  

_init_ : コンストラクタ

_init_の使い方 https://www.fenet.jp/dotnet/column/tool/7263/

Pythonのコンストラクタである__init__の特徴は、クラス名を書くことで、コンストラクタを呼び出せることです。つまり、自動呼び出しされるということです。また、オブジェクトの生成と同時にデータを初期化することができます。


# クラス定義
class Human:
    # インスタンス変数
    name = None # 名前
    # コンストラクタ
    def __init__(self, name):
        self.name = name
 
    # インスタンスメソッド
    def printinfo(self):
        print('name:{0}' . format(self.name))
 
# インスタンス生成
human1 = Human('taro')
 
human1.printinfo()

class : 決められた処理方法

【Python】classの使い方を理解しよう!役割や実践方法を徹底解説! | TechTeacher Blog (tech-teacher.jp)

if 文 : or、 and の複合条件、複数条件 

図解!Pythonのif文でand、orによる複数条件の指定方法を徹底解説! – AI-interのPython3入門 (ai-inter1.com)

Lineへの通知 : 

トークンの取得方法 LINE Notify アクセストークン – firestorage Biz

Lineへのメッセージの送付 PythonでLINE Notifyへ通知を送る – Qiita
メッセイージをLineに送付


import requests

#Lineに送信する
    
def main():
    #send_line_notify('てすとてすと')
    send_line_notify(link_1.text)
def send_line_notify(notification_message):
    """
    LINEに通知する
    """
    line_notify_token = '取得したアクセストークン'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'message: {notification_message}'}
    requests.post(line_notify_api, headers = headers, data = data)

if __name__ == "__main__":
    main()


# ブラウザを閉じる
driver.quit()

PIPが有効でない : >py -m pipを使う。 

「Pythonが動かない…」の簡単な解決方法(Windows) – ガンマソフト株式会社 (gammasoft.jp)

Pythonのバージョンとディレクトリーの確認: >py –list-paths

unicode error “unicodeescape”の原因と解決方法 : フォルダーを表示する ” \ ” と ” / “

【Python】エラー:unicode error “unicodeescape”の原因と解決方法 | OFFICE54

2次元配列を1次元に変換 : np.ravel

NumPy配列ndarrayを一次元化(平坦化)するravelとflatten | note.nkmk.me

import numpy as np

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.ravel(a))
# [ 0  1  2  3  4  5  6  7  8  9 10 11]

print(type(np.ravel(a)))
# <class 'numpy.ndarray'>

グローバル変数とローカル変数 : 

[Python入門]関数のローカル変数とスコープ:Python入門(1/3 ページ) – @IT (itmedia.co.jp)

■グローバル変数の設定

def myfunc():
    global a      # 「a」はグローバル変数aであると宣言
    a = 'Python'  # グローバル変数aの値を変更
    print('a:', a)

a = 'Ruby'
myfunc()
print(a)

■関数内の変数はローカル変数と認識する。Python♪関数で変なエラーが出た:local variable ‘x’ referenced before assignment | Snow Tree in June (snowtree-injune.com)

#コード01
def test1():
    print(x)
    x = 5
    
x = 2

#出力01
UnboundLocalError: local variable 'x' referenced before assignment
test1()
#コード02
def test1():
    x = 5
    print(x)
    
x = 2
test1()

#出力02
5

テキストボックス カンマ区切り、空白等で複数のテキストを配列入力する : split

Python, splitでカンマ区切り文字列を分割、空白を削除しリスト化 | note.nkmk.me

s = 'one two three'
l = s.split()
print(l)
# ['one', 'two', 'three']

s = 'one two        three'
l = s.split()
print(l)
# ['one', 'two', 'three']

s = 'one\ttwo\tthree'
l = s.split()
print(l)
# ['one', 'two', 'three']

一定時間毎に繰り返し実行する : schedule

【Python】scheduleを使ってモジュールを定期実行させよう – Qiita

def job():
    #exec(open("tennis_sisetsu_sentaku.py").read())
    #exec(open("tennis_web_sample_search_id_tag.py").read())
    nagoya()
    print(datetime.datetime.now())
    
schedule.every(0.3).minutes.do(job)
#繰り返し実行のため、while文で無限ループ状態にする
while True:
   schedule.run_pending()
   time.sleep(1)

条件設定によりwhileループをbreakする。


#現在時刻が設定時刻(settei_datetime)に到達したらbreakする。
settei_datetime = datetime.datetime(2021,10,27,2,30)
while True:
    schedule.run_pending()
    if settei_datetime <= datetime.datetime.now():
        break
    time.sleep(1)

関数内の変数を関数の外で共有する : class

【基本】python : 関数の内と外で変数を共有する方法 | ぼお’s (pasopet.com)

#def内の変数 sisetsu_1.numberをdef外で使用するためclass設定を行う。Nagoya_tennis_sisetsu_sentaku.py
class sisetsu_1:
    def __init__(self,number):
        self.number=number

キー操作でプログラムを停止する : ctrl + C (run中のコードをcloseしたうえで)

エックスサーバーへのログイン : otoiawaseメール

import smtplib
import ssl

# SMTPサーバー(今回はGmailで送信)
smtp_server = “sv4.xbiz.ne.jp”
port_number = 465

# ログイン情報(今回はGmailのアカウントを入力する)
account = “********@******”
password = “************”

# SMTPサーバーに接続
context = ssl.create_default_context()
server = smtplib.SMTP_SSL(smtp_server, port_number, timeout=10, context=context)
res_login=server.login(account, password)
print(res_login)

ログインに成功すれば以下メッセージが表示される。(print(res_login)
(235, b’2.7.0 Authentication successful’)

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import ssl

# 自分のメールアドレス
my_address = "mky_nw@yahoo.co.jp"

# SMTPサーバー(今回はGmailで送信)
smtp_server = "sv4.xbiz.ne.jp"
port_number = 465

# ログイン情報(今回はGmailのアカウントを入力する)
account = "********@*****.co.jp"
password = "*********"

# メッセージの準備
msg = MIMEMultipart()

# 件名、メールアドレスの設定
msg["Subject"] = "ご請求書送付のご案内[株式会社エクセルパイソン]"
msg["From"] = my_address
msg["To"] = my_address

# メール本文の追加
text = open("mail_body.txt", encoding="utf-8")
body_temp = text.read()
text.close()
body_text = body_temp.format(
    company="株式会社鈴木商店",
    department="調達部第1課",
    person="平松真一"
)
body = MIMEText(body_text)
msg.attach(body)

# 添付ファイルの追加
pdf = open("C0001.pdf", mode="rb")
pdf_data = pdf.read()
pdf.close()
attach_file = MIMEApplication(pdf_data)
attach_file.add_header("Content-Disposition","attachment",filename="C0001.pdf")
msg.attach(attach_file)

# SMTPサーバーに接続
context = ssl.create_default_context()
server = smtplib.SMTP_SSL(smtp_server, port_number, timeout=10, context=context)

#server = smtplib.SMTP(smtp_server, port_number)
#server.starttls()
res_login=server.login(account, password)
print(res_login)
#server.login(account, password)

# メール送信
server.send_message(msg)

# SMTPサーバーとの接続を閉じる
server.quit()

テキスト(文字列)を結合する : 

テキストを結合する Pythonで文字列を連結・結合(+演算子、joinなど) | note.nkmk.me

link_sum = '1' 
for link in links_4:
    print(link.text)
    link_sum = link_sum+'\n'+link.text #\nで改行 ¥n
print(link_sum)

Pythonで文字列を連結・結合(+演算子、joinなど) | note.nkmk.me

s = 'aaa' + 'bbb' + 'ccc'
print(s)
# aaabbbccc

s1 = 'aaa'
s2 = 'bbb'
s3 = 'ccc'

s = s1 + s2 + s3
print(s)
# aaabbbccc

s = s1 + s2 + s3 + 'ddd'
print(s)
# aaabbbcccddd

比較演算子 : 

x == y       x と y が等しい
X != y       x と y が等しくない
x > y        x は y よりも大きい
x < y        x は y よりも小さい
x >= y       x は y と等しいか大きい
x <= y       x は y と等しいか小さい
x in y       x という要素 が y に存在する
x not in y   x という要素 が y に存在しない

パッケージのダウンロード : (コマンドプロンプト)>py -m pip install pywin32

(コマンドプロンプト)> でpip を使用する際は >py -m に続けて使用すると機能する。

他のプログラムを起動する : 

htmlメールのセキュリテイリスク : html、リッチテキスト

HTMLとテキストメール、それぞれの長所と短所は?…CVRを高めるメルマガ講座(9) | 通販通信ECMO (tsuhannews.jp)
リッチテキスト リッチテキストマルウェアがウイルス対策ソフトの盲点を突く? – ITmedia エンタープライズ
リッチテキスト リッチ・テキストによるマルウエア | 日経クロステック(xTECH) (nikkei.com)

文字列を検索する(〜を含むか判定、位置取得、カウント) : 

Pythonで文字列を検索(〜を含むか判定、位置取得、カウント) | note.nkmk.me

任意の文字列を含むか判定: in演算子

s = 'I am Sam'

print('Sam' in s)
# True

print('sam' in s)
# False

print('I' in s and 'Sam' in s)
# True

メールサーバーに接続する : sever.login((account, password)

import smtplib

# SMTPサーバー(今回はGmailで送信)
smtp_server = "smtp.gmail.com"
port_number = 587

# ログイン情報(今回はGmailのアカウントを入力する)
account = "***********@gmail.com"
# Gmailの場合アプリパスワードが必要(次項にて設定方法を説明)
password = "****************"

# 1)SMTPサーバーの指定
server = smtplib.SMTP(smtp_server, port_number)

# SMTPサーバーの応答確認
res_server = server.noop()
print(res_server)

# 2)暗号化通信の開始
res_starttls = server.starttls()
print(res_starttls)

# 3)ログイン
res_login = server.login(account, password)
print(res_login)

# 5)接続を閉じる
server.quit()

Googleアプリパスワードの取得方法
Pythonでメール(gmail)を送信できない場合の解決法 | goccaの進捗記録

写真付きメール(html形式)のメール送信
pythonを使用してGmailでhtml形式メールを自動送信する方法 (wheelchairtext.net)

多重ループ(ネストしたforループ)からbreak: break

Pythonで多重ループ(ネストしたforループ)からbreak | note.nkmk.me

for i in l1:
    for j in l2:
        print(i, j)
        if i == 2 and j == 20:
            print('BREAK')
            break
    else:
        continue
    break
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# BREAK

chromedriver-binary : Chromeの操作

chromedriverのフォルダー:

chromedriverのバージョンを指定してインストール
>py -m pip install chromedriver-binary ==96.0.4664.45

datetime : 現在時刻、日付、日時を取得

Pythonで現在時刻・日付・日時を取得 | note.nkmk.me

import datetime

dt_now = datetime.datetime.now()
print(dt_now.day)
tsuki=dt_now.month #利用月(今日の月)
hi=dt_now.day #利用日(今日)

for ~ in: ループ処理

Pythonのfor文によるループ処理(range, enumerate, zipなど) | note.nkmk.me

複数リスト(配列)のループ処理

names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]

for name, age in zip(names, ages):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18

2重ループ 同じインデント(半角4コマ)の行がforの範囲となる。

customer_list = []
for row in ws_master.iter_rows(min_row=2):
    if row[0].value is None:
        break
    value_list = []
    for c in row:
        value_list.append(c.value)
    customer_list.append(value_list)
print(customer_list)

■break : 条件に一致でfor 文より抜ける Pythonのforループのbreak(中断条件) | HEADBOOST

nums1 = [1, 2, 3]
nums2 =[10, 20, 300]

for i in nums1:
    for j in nums2:
        if i == 2 and j >= 100:
            print('中断')
            break
        print(i, j)

html形式メールの送信 : html の一部のテキストを差し替える

リンク先:https://1-notes.com/python-replace-html/

page_data={}
page_data['company']= '愛知機械'
page_data['person']= '鈴木'


for data in customer_list:
    to_mail=data[4]
    #メッセージの準備
    msg = MIMEMultipart('alternative')

    msg['Subject'] = "第1回名古屋スマート物流EXPOご来場の御礼 愛知機械テクノシステム" #件名を入力
    msg['From'] = from_mail
    if test_mode:
        msg['To'] = from_mail
    else:
        msg['To'] = data[4]
    

    text = "先般スカイエクスポで開催されました国際物流総合展2021には、ご多用の中弊社ブースに\n"
            

    html = """
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp"/>
            <meta http-equiv="content-style-type" content="text/css">
            <meta http-equiv="content-language" content="ja">
            <title></title>
            <style type="text/css">
                html {width:100%;height:100%;}
                body {font-family: Arial,Helvetica,sans-serif; }
            </style>
        </head>
        <body>
            <p style='font-size:12.0pt;font-family:游ゴシック'>
            {% company %}<br>
            {% person %}様<br>
   先般スカイエクスポで開催されました国際物流総合展2021にはご多用の中弊社ブース<br>
お立ち寄りいただきまして大変ありがとうございました。 <br>

html形式メールの送信 : 送信先1か所

【ほぼコピペでOK】pythonでHTMLメールの送り方 (fromation.co.jp)

画像は絶対アドレスのURL指定は表示される。
cid形式の場合、以下のコードではoutlookで表示されない。Gmailでは表示される。

HTMLメールの送信方法の説明サイト
HTMLメールはどうやって作成するの?基本と特徴を徹底解説!【保存版】 (willcloud.jp)

#mail_html.py
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import ssl

smtp_host = 'sv4.xbiz.ne.jp' #ホストを指定
smtp_port = 465
smtp_account_id = '*********@*****.co.jp' #ユーザー名を指定
smtp_account_pass = '**********' #パスワードを入力
from_mail = "otoiawase@aiki-tcs.co.jp"  # 送信元メールアドレス
to_mail = "masaniwa55@gmail.com"  # 送信先メールアドレス
msg = MIMEMultipart('alternative')
msg['Subject'] = "タイトル" #件名を入力
msg['From'] = from_mail
msg['To'] = to_mail

#cid形式の画像取り込み このコードではoutlookで表示されない。Gmailでは表示される。
with open('hirugano1.png', 'rb') as img:
            mail_img = MIMEImage(img.read())
            mail_img.add_header('Content-ID', '<mail_image>')
msg.attach(mail_img)


text = "送信テストです。.nマルチパートで送っています。.nどうですか?"
html = """
<html>
  <head></head>
  <body>
    <p style='font-size:16.0pt;font-family:游ゴシック'>送信テストです。</p>
    <p>マルチパートで送っています。</p>
    <p>どうですか?</p>
    <img src="http://kawana.php.xdomain.jp/wp-content/uploads/2021/08/hirugano1.png" alt="picture" width="400">

    <!-- cid 形式画像はoutlookで表示されない。GmailはOK<img src="cid:mail_image" alt="picture" style="width:100px;">-->

  </body>
</html>
"""
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)
context = ssl.create_default_context()
server = smtplib.SMTP_SSL(smtp_host, smtp_port, timeout=10, context=context)
server.login(smtp_account_id, smtp_account_pass)
server.sendmail(from_mail, to_mail, msg.as_string())
server.quit()

html形式メールの送信 : EXCELリストの送信先に一括送信

#mail_html_list.py
import sys
import openpyxl
from pathlib import Path
#以下htmlメール送信用
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import ssl
from email.mime.image import MIMEImage

# 顧客マスタ.xlsxの読み込み
wb_master = openpyxl.load_workbook("顧客マスタ.xlsx")
ws_master = wb_master["Sheet1"]

customer_list = []
for row in ws_master.iter_rows(min_row=2):
    if row[0].value is None:
        break
    value_list = []
    for c in row:
        value_list.append(c.value)
    customer_list.append(value_list)

for customer in customer_list:
    print(customer)

# モード選択
print()  # 1行空ける
mode = input("モード選択(テスト=test、本番=real):")
# 本番以外はテスト
if mode != "real":
    test_mode = True
else:
    test_mode = False

# 送信確認
if test_mode:
    result = input("テストモードで自分宛てに送信します(続行=yes、中止=no):")
else:
    result = input("本番モードで送信します(続行=yes、中止=no):")

# 続行以外は中止
if result != "yes": #!=は不一致を表す
    print("プログラムを中止します")
    sys.exit()

#smtpサーバーにログイン
smtp_host = 'sv4.xbiz.ne.jp' #ホストを指定
smtp_port = 465
smtp_account_id = 'otoiawase@aiki-tcs.co.jp' #ユーザー名を指定
smtp_account_pass = 'VT5wCu8JQvSL' #パスワードを入力
context = ssl.create_default_context()
server = smtplib.SMTP_SSL(smtp_host, smtp_port, timeout=10, context=context)
server.login(smtp_account_id, smtp_account_pass)

#customer_listの顧客に1通ずつメールを送信
from_mail="otoiawase@aiki-tcs.co.jp"

for data in customer_list:
    to_mail=data[4]
    #メッセージの準備
    msg = MIMEMultipart('alternative')

    msg['Subject'] = "タイトル" #件名を入力
    msg['From'] = from_mail
    if test_mode:
        msg['To'] = from_mail
    else:
        msg['To'] = data[4]
    

    #cid形式画像ファイルの読み込み(outlookで表示できないので使用せず)
    #with open('hirugano1.png', 'rb') as img:
        #mail_img = MIMEImage(img.read())
        #mail_img.add_header('Content-ID', '<mail_image>')
    #msg.attach(mail_img)


    text = "送信テストです。.nマルチパートで送っています。.nどうですか?"
    html = """
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp"/>
            <meta http-equiv="content-style-type" content="text/css">
            <meta http-equiv="content-language" content="ja">
            <title></title>
            <style type="text/css">
                html {width:100%;height:100%;}
                body {font-family: Arial,Helvetica,sans-serif; }
            </style>
        </head>
        <body>
            <p style='font-size:32.0pt;font-family:游ゴシック'>送信テストです。</p>
            <p>マルチパートで送っています。</p>
            <p>どうですか?</p>
            <!-- cid メールはoutlookで表示されない。GmailはOK<img src="cid:mail_image" alt="picture" style="width:100px;">--><br>
            <img src="https://uhuru-lab.com/wp-content/uploads/2021/09/float1.png" alt="LOGO" width="262" style="max-width:100%;">
            <!--参考行 <img src="https://www.sapana.co.jp/img/htmlmail/htmlmail_logo.png" alt="LOGO" width="262" height="38" style="max-width:100%;color:#ffffff;">-->
            <img src="http://kawana.php.xdomain.jp/wp-content/uploads/2021/08/hirugano1.png" alt="picture" width="400">
        </body>
        </html>
        """
    part1 = MIMEText(text, 'plain')
    part2 = MIMEText(html, 'html')
    msg.attach(part1)
    msg.attach(part2)
    print("メール送信 : ", data[0], data[1])
    server.sendmail(from_mail, to_mail, msg.as_string())
server.quit()

if __name__ == ‘__main__’: : importしただけで実行しない

Pythonのif __name__ == “__main__” とは何ですか?への回答 – Python学習チャンネル by PyQ

def main():
    #send_line_notify('てすとてすと')
    send_line_notify(link_sum)
def send_line_notify(notification_message):
    """
    LINEに通知する
    """
    line_notify_token = '67uU1td4Uvyzr6C7KjvMR76DrK2t3BqvCM0wBCm9j1j'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'message: {notification_message}'}
    requests.post(line_notify_api, headers = headers, data = data)

if __name__ == "__main__":
    main()

pdfminer : pdfをテキストに変換する。

pdf化(pdfminer) :PythonのpdfminerでPDFのテキストを抽出する方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
各種Libaly :PythonでPDFからテキストを読み取る方法について – ガンマソフト株式会社 (gammasoft.jp)
OCRの場合:【Python】画像から文字起こししてテキストに変換する方法(tesseract-OCR、pyocr)|ぷんたむの悟りの書 (punhundon-lifeshift.com)

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage

input_path = 'chinese1.pdf'
output_path = 'result.txt'

manager = PDFResourceManager()

with open(output_path, "wb") as output:
    with open(input_path, 'rb') as input:
        with TextConverter(manager, output, codec='utf-8', laparams=LAParams()) as conv:
            interpreter = PDFPageInterpreter(manager, conv)
            for page in PDFPage.get_pages(input):
                interpreter.process_page(page)

.read() : ファイルの全文を読み込む。 .format() : { }内の変数に文字列を代入する。

# メール本文をファイルから読み込む
f = open("mail_body.txt", encoding="utf-8")
body_temp = f.read()
f.close()

# メール本文の波かっこの部分を置き換える
body_text = body_temp.format(
    company="株式会社鈴木商店",
    department="調達部第1課",
    person="平松真一"
)

print(body_text)

mail_body.txt
{company} {department}
{person} 様

いつも大変お世話になっております。
株式会社エクセルパイソンの田中です。

7月分のご請求書をPDFファイルにて、
本メールに添付させていただきました。
何卒ご査収のほどお願い申し上げます。

ご不明な点等がございましたら、
お問い合わせいただけたら幸いです。

今後とも宜しくお願い申し上げます。


株式会社エクセルパイソン
営業本部 田中一郎

TEL. 00-0000-0000
FAX. 00-0000-0000


selenium : webを操作する。情報を収集する。

■Webページを表示する。

from selenium import webdriver
import time
# chromedriver.exeがある場所
driver_path = "driver/chromedriver.exe"
# WebDriverの作成
driver = webdriver.Chrome(executable_path=driver_path)

# www.google.co.jpを開く
driver.get("https://www.google.co.jp")
print(driver.title, driver.current_url)
time.sleep(2)

# www.yahoo.co.jpを開く
driver.get("https://www.yahoo.co.jp")
print(driver.title, driver.current_url)
time.sleep(2)

# www.python.orgを開く
driver.get("https://www.python.org")
print(driver.title, driver.current_url)
time.sleep(2)

# www.yahoo.co.jpに戻る
driver.back()
print(driver.title, driver.current_url)
time.sleep(2)

# www.google.co.jpに戻る
driver.back()
print(driver.title, driver.current_url)
time.sleep(2)

# webdriverの終了(ブラウザを閉じる)
driver.quit()

■テキスト入力、キー入力、クリックを操作する

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# chromedriver.exeがある場所
driver_path = "driver/chromedriver.exe"

# webdriverの作成
driver = webdriver.Chrome(executable_path=driver_path)

# 要素が見つからない場合は10秒待つように設定
driver.implicitly_wait(10)

# www.google.co.jpを開く
driver.get("https://www.google.co.jp")

# 検索ボックスに「札幌天気」を入力して、Enterキーを押す
driver.find_element(By.NAME, "q").send_keys("札幌天気" + Keys.ENTER)

# [降水確率]のボタンをクリック
driver.find_element(By.ID, "wob_rain").click()

# 5秒待つ
time.sleep(5)

# ブラウザを閉じる
driver.quit()

■CSSセレクターによる要素取得
【Python】SeleniumのCSSセレクターの使い方 | プログラミングで人生が楽になりました (posipochi.com)

class名で取得:driver.find_element_by_css_selector(“.sp006a”).click()  #注意:class名の前のピリオド必要

class名で取得 Python/Seleniumでclass名で情報取得する方法 | WATLAB -Python, 信号処理, AI- (watlab-blog.com)

def ranking(driver):
    class_name = 'LC20lb'                   # class属性名
    class_elems = driver.find_elements_by_class_name(class_name) # classでの指定
 
    # 取得した要素を1つずつ表示
    for elem in class_elems:
        print(elem.text)


タグ名で取得:driver.find_elements(By.TAG_NAME, “p”)

複数の要素より特定の要素を取得 selenium – seleniumで要素取得したいが,2つ同名のものがあるため,後者を選択できない – スタック・オーバーフロー (stackoverflow.com)

複数の要素を取得
タグ名やクラス名で要素を指定すると複数の要素を取ることができます。
その時は、「find_element」部分を「find_elements」として配列で取得したい要素のインデックスを指定します。

elem2 = browser.find_elements_by_class_name('post-content')
elem2[1].text

上記を応用すれば例えば以下のように出来るのでは?

driver.find_elements_by_css_selector('.button')[1].click()

■img の alt の記述を取得 : getAttribute(‘alt’)

akis = driver.find_elements_by_id('emptyStateIcon') #imgのID
                for aki in akis:
                    print("aki",aki.get_attribute('alt'))

■検索した要素のテキストとhref属性の値を表示

#p要素を取得
links = driver.find_elements(By.TAG_NAME, "p")
# 検索した要素のテキストとhref属性の値を表示
for link in links:
    print(link.text)
    print(link.get_attribute("href"))

■XPATHの基礎 クローラ作成に必須!XPATHの記法まとめ – Qiita

xpath 使用例 特定のタグ下のhrefを取得

 kiji_link_arr=[]
    for link in driver.find_elements_by_xpath("//article/*[@href]"):
        kiji_link=link.get_attribute('href')
        kiji_link_arr.append(kiji_link)

属性を指定する:
classのような要素に紐づく属性をXPathでは『@』で表します。
『1,200円』という要素を取得したい場合は、属性を用い下記のように書くことができます。

<html>
...
  <body>
    <h1>ワンピース</h1>
    <div class="item">
      <span class="brand">iQON</span>
      <span class="regular_price">1,200円</span>
      <span class="sale_price">1,000円</span>
    </div>
  </body>
</html>
/html/body/div/span[@class='regular_price']

■.textのテキストでデータ取得しクリック等の処理をする。:contains

 page_up=driver.find_element_by_xpath("//a[@id='goFooterPager']/span[contains(text(), '"+str(page+1)+"')]")
                        page_up.click()

 page_up=driver.find_element_by_xpath("//a[@id='goFooterPager']/span[contains(text(), '2')]")
                        page_up.click()

■tableの中の指定の行列をクリックする。selenium — Seleniumを使用してテーブル内の特定の行を見つける方法は? (webdevqa.jp.net)


ネット愛知
    thirdCell = driver.find_element_by_xpath("//table[2]/tbody/tr[6]/td[1]") #elementsにしないこと(sをつけるとlistになる)
    #for Cell in thirdCell: #elememts(s付としてlistの場合)のみ書き出し可能
     #   print("thirdCell",Cell.text)
    thirdCell.click()

■画像をダウンロードし保存する。Python – Anacondaで画像収集|teratail

# -*- coding: utf-8 -*-
import requests
from requests.compat import urljoin
from bs4 import BeautifulSoup

URL = 'http://www.gochiusa.com/ova/'
images = []

soup = BeautifulSoup(requests.get(URL).content,'lxml')

for link in soup.find_all("img"):
    if link.get("src").endswith(".jpg"): #pngの場合は.png
        print(link.get("src"))
        # 相対URLから絶対URLに変換
        images.append(urljoin(URL, link.get("src")))

for target in images:
    resp = requests.get(target)
    with open('img/' + target.split('/')[-1], 'wb') as f: #/imgのフォルダーに保存
        f.write(resp.content)

.stem : 拡張子なしのファイル名の文字列を取得。

strptime : 文字列を、期日、日時に変換

日時の比較演算子を使う場合、日時以降、以前等
Python 日付・時刻の比較・計算・その他 : showeryのブログ (blog.jp)

Pythonで日付文字列からのdatetime変換やタイムゾーンの変更などをいい加減覚えたい – そうなんでげす (soudegesu.com)

# タイムゾーンあり
import datetime

utc_date_str = '2018-04-01 20:10:56.123+0900'
dt = datetime.datetime.strptime(utc_date_str, '%Y-%m-%d %H:%M:%S.%f%z')

print(dt)
>> 2018-04-01 20:10:56.123000+09:00
print(p_file.stem)
# file

print(type(p_file.stem))
# <class 'str'>

TypeError: descriptor ‘date’ for ‘datetime.datetime’ objects doesn’t apply to a ‘int’ object :エラーメッセージの対応

from datetime import date
my_date= date(2021, 3, 2)

メールを送る(添付ファイル付き) : MIMEMultipart, MIMEText, MIMEApplication

MIMEMultipart : メールとしての入れ物を作る。件名、自分のメールアドレス、相手のメールアドレス

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

# 自分(送信先)のメールアドレス
my_address = "*******@gmail.com"

# SMTPサーバー(今回はGmailで送信)
smtp_server = "smtp.gmail.com"
port_number = 587

# ログイン情報(今回はGmailのアカウントを入力する)
account = "*******@gmail.com"

# Gmailの場合アプリパスワードが必要
password = "****************"

# メッセージの準備
msg = MIMEMultipart()

# 件名、メールアドレスの設定
msg["Subject"] = "ご請求書送付のご案内[株式会社エクセルパイソン]"
msg["From"] = my_address
msg["To"] = my_address

# メール本文の追加
text = open("mail_body.txt", encoding="utf-8")
body_temp = text.read()
text.close()
body_text = body_temp.format(
    company="株式会社鈴木商店",
    department="調達部第1課",
    person="平松真一"
)
body = MIMEText(body_text)
msg.attach(body)

# 添付ファイルの追加
pdf = open("C0001.pdf", mode="rb")
pdf_data = pdf.read()
pdf.close()
attach_file = MIMEApplication(pdf_data)
attach_file.add_header("Content-Disposition","attachment",filename="C0001.pdf")
msg.attach(attach_file)

# SMTPサーバーに接続
server = smtplib.SMTP(smtp_server, port_number)
server.starttls()
server.login(account, password)

# メール送信
server.send_message(msg)

# SMTPサーバーとの接続を閉じる
server.quit()

CSVファイルを結合 : .glob(“*.csv”):

import csv
from pathlib import Path

# 「売上月別」フォルダー内CSVファイルの読み込み
rows = []
skip_num = 0
for file in Path("売上月別").glob("*.csv"):
    f = open(file)
    reader = csv.reader(f)
    for row in reader:
        if reader.line_num <= skip_num:
            continue
        rows.append(row)
    f.close()
    skip_num = 3

# 書き込み
f = open("第1四半期売上.csv", mode="w", newline="")
writer = csv.writer(f)
for row in rows:
    writer.writerow(row)
f.close()

CSVファイルにデータを追加 : writer.writerow(data)

import csv

add_list = [
["2020/5/15", "三和商事 株式会社", "商品B", "3800", "10", "38000"],
["2020/5/20", "三和商事 株式会社", "商品B", "3800", "30", "114000"],
["2020/5/26", "サン企画 有限会社", "商品A", "7200", "5", "36000"],
["2020/5/29", "三和商事 株式会社", "商品B", "3800", "15", "57000"]
]

f = open("5月売上.csv", mode="a", newline="")
writer = csv.writer(f)
for data in add_list:
    writer.writerow(data)
f.close()

CSVの書き込み : writer.writerow(data)

import csv

data_list = [
["売上データ", "", "", "", "", ""],
["", "", "", "", "", ""],
["売上日", "顧客名称", "商品名", "単価", "数量", "計"],
["2020/5/7", "サン企画 有限会社", "商品B", "3800", "10", "38000"],
["2020/5/8", "三和商事 株式会社", "商品A", "7200", "7", "50400"],
["2020/5/11", "株式会社 鈴木商店", "商品C", "1200", "100", "120000"]
]

f = open("5月売上.csv", mode="w", newline="")
writer = csv.writer(f)
for data in data_list:
    writer.writerow(data)
f.close()

CSVの読み込み : csv.reader()

# csvモジュールをオープン
import csv


#ヘッダー行数
header_num = 3


f = open("data/4月売上.csv")
reader = csv.reader(f)
for row in reader:
#データの開始行から読み込みを開始する   
    if reader.line_num <= header_num:
        continue
    print(row)
f.close()

EXCEL から条件に合うデータを検索する:startswith(“K”)

EXCELデータの読み込み部

customer_list = [] #EXCELデータを書き込む配列
for row in ws.iter_rows(min_row=2):  #1行(row)毎に読み込み
if row[0].value is None:
break
value_list = []
for c in row:  #1行毎に各列(c)を読み込み
value_list.append(c.value)
customer_list.append(value_list)

#書き込まれた配列を確認する。
for customer in customer_list:
print(customer)

import openpyxl

wb = openpyxl.load_workbook("顧客マスタ.xlsx")
ws = wb["Sheet1"]

# 顧客マスタの全データリスト
customer_list = []

for row in ws.iter_rows(min_row=2):
    if row[0].value is None:
        break
    value_list = []
    for c in row:
        value_list.append(c.value)
    customer_list.append(value_list)

# 検索結果リスト
target_list = []

# 顧客の検索
for customer in customer_list:
    # 検索条件(顧客IDがKで始まるか)
    if customer[0].startswith("K"):
        target_list.append(customer)

# 確認
for target in target_list:
    print(target)

EXCEL からデータを検索する: if customer[0] == customer_id:

import openpyxl

wb = openpyxl.load_workbook("顧客マスタ.xlsx")
ws = wb["Sheet1"]

# 顧客マスタの全データリスト
customer_list = []

for row in ws.iter_rows(min_row=2):
    if row[0].value is None:
        break
    value_list = []
    for c in row:
        value_list.append(c.value)
    customer_list.append(value_list)

# 検索する顧客ID
customer_id = "K0004"

# 顧客の検索
for customer in customer_list:
    # 検索条件(顧客IDの一致)
    if customer[0] == customer_id:
        target = customer
        # 確認
        print(target)
        break

EXCEL から1行毎に読み込む : iter_rows

import openpyxl
import datetime

wb = openpyxl.load_workbook("data/売上データ.xlsx")
ws = wb["4月売上"]

# 4行目以降、1行毎に読み込む
for row in ws.iter_rows(min_row=4):
    # その行の1列目が空欄の場合ループを終了する
    if row[0].value is None:
        break
    value_list = []
    for c in row:
        value_list.append(c.value)
    print(value_list)

EXCEL への書き込み : ファイルのオープンからセルのデータ書き込み、書式の設定

PythonでExcelファイル(xlsx)を読み書きするopenpyxlの使い方 | note.nkmk.me

import openpyxl
import datetime

wb = openpyxl.load_workbook("data/売上データ.xlsx")
ws = wb["4月売上"]

# セルにデータを書き込む 注意:書き込むファイルを閉じておくこと。
c1 = ws["A10"]
c1.value = datetime.datetime(2020, 9, 19)
# 書式を設定する
c1.number_format = "yyyy/m/d"
c2 = ws["B10"]
c2.value = "KawanaLab"
c3 = ws["C10"]
c3.value = "PHP"
c4 = ws["D10"]
c4.value = 1234
c5 = ws["E10"]
c5.number_format = "#,##0"
c5.value = 5678
c6 = ws["F10"]
c6.value = "=D10*E10"
c6.number_format = "#,##0"

wb.save("data/売上データ_1.xlsx")

EXCEL ファイルの開閉 : ファイルのオープンからセルのデータ読み込み

pythonでのエクセルの閉じ方を教えてください。 – エクセルをpyth… – Yahoo!知恵

import win32com.client

EXCELを起動する
xl = win32com.client.Dispatch(‘Excel.Application’)
xl.Visible = True
wb = xl.Workbooks.Open(r’C:/Users/aaaa/aa.xlsx’)

#ブックを閉じる
wb.Close()
#Excelを閉じる
xl.Quit()

openpyxlは読み書きはするがオープン、クローズはできない。

EXCEL の読み込み : ファイルのオープンからセルのデータ読み込み

import openpyxl
# ファイルオ-プン data_only = Trueなしの場合は数式がそのまま表示される。
wb = openpyxl.load_workbook("data/売上データ.xlsx",data_only = True)

# worksheetの表示
ws = wb["4月売上"]
# セル名称を表示
print(ws.title)

c = ws["A2"]
# セル番地を表示
print(c.coordinate)
# 行番号を表示
print(c.row)
# 列番号を表示
print(c.column)

c2 = ws.cell(2,1)
# 行番号を表示
print(c2.row)
# 列番号を表示
print(c2.column)

c1 = ws["A4"]
#セルの値を表示
print(c1.value)
c2 = ws["B4"]
print(c2.value)
c6 = ws["F4"]
print(c6.value)

スタートアップ : インストールより開始

・Pythonサイトよりインストール
・ライブラリーより
  ①openpyxl : EXCELを操作する  
  ②selenium : ブラウザを操作する
コマンドプロンプトにて
   >py -m pip install openpyxl
>py -m pip install selenium

re. : 文字列から数字を抽出

[解決!Python]文字列から正規表現を使って数字だけを抽出するには(re.findall/re.sub/re.search関数):解決!Python – @IT (itmedia.co.jp)

import re

s = '2021年03月12日 15時30分'

m = re.findall(r'\d+', s)  # 文字列から数字にマッチするものをリストとして取得
print(m)  # ['2021', '03', '12', '15', '30']
r = ''.join(m)
print(r)  # 202103121530

r = re.sub(r'\D', '', s)  # 元の文字列から数字以外を削除=数字を抽出
print(r)  # 202103121530

# re.search関数は最初にマッチするものだけを返送する
m = re.search(r'\d+', s)
r = m.group()
print(r)  # 2021

# re.search関数で全ての数字を抽出する
m = re.search(r'(\d+)\D+(\d+)\D+(\d+)\D+ +(\d+)\D+(\d+)\D+', s)
r = m.groups()
print(r)  # ('2021', '03', '12', '15', '30')
r = m.group(2)
print(r)  # 03

tkinter : 入力画面の作成

tkinterの使い方 オプション等:【Python tkinter】Entry(エントリー)の使い方:オプション一覧(サイズ・外観) | OFFICE54

# ラベル 投稿日 年
    label = tk.Label(justify="center",width=7,text='年')
    label.place(x=500, y=280)
    # テキストボックス 検索キーワード
    global txtBox_tokobi_year
    global year
    txtBox_tokobi_year = tk.Entry(justify="center",width=8)
    txtBox_tokobi_year.place(x=500, y=300)
    txtBox_tokobi_year.insert(tk.END,"2021")
    year=txtBox_tokobi_year.get()

【Python】tkinterでGUIの画面を作成する!|フライテック (flytech.work)

PythonでGUIを使ってファイル・フォルダのパスを取得する方法【Tkinter】 | 転職だらけ (engineer-jobchange.com)

ウィジェットの配置 pack grid place 【Python/tkinter】ウィジェットの配置(pack) | イメージングソリューション (imagingsolution.net)

ボタン 【Python Tkinter】Button(ボタン)の使い方:オプション引数一覧(サイズ・配置・外観) | OFFICE54

配列 : 配列関係

空のlistに値を代入 Pythonで空のlistに値を代入する方法【初心者向け】 | TechAcademyマガジン

win32com.clientのインストール : 

Githubより最新版をダウンロードする。Pythonのバージョンに合わせること。
https://github.com/mhammond/pywin32/releases
手順
https://yukun.info/python-win32com-module-install/

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

コマンドプロンプトで以下コマンドラインでインストールする。(openpyxlの例)
C:¥Users\masa>py -m pip install openpyxl