作業効率を上げるpythonのテンプレート

こんにちは、中村です。

今回は、作業効率を上げるために、pythonのテンプレートを作ったのでまとめます。ここには概要だけを書くことにしましょう。

環境:windows10、pip3
※pip3でプログラムを作成したが、anacondaでもGmailとExcelを操作するプログラムは動きます。

pythonのテンプレートとは何かといいますと、Gmail、Excel、pdfを操作するために基礎となるプログラムをまとめたものです。

たとえばGmailを操作したいんだったら、ここに載せたテンプレートをちょいとテキストファイルや送信リストなどを書きかえて実行すれば、100人に一斉送信なんてことができます。そんな感じで、Excel版もpdf版も作りました(pdfは操作の方法が色々あるのですが、とりあえずページごとに分割するプログラムを作りました)。

画像1

このように、WindowsのUsersディレクトリの下にフォルダをつくってそこにプログラミングを入れておくと管理がしやすくなります。

今回は、ソースコードを載せて一旦終わりましょう。

画像2

・Excelファイルのpythonテンプレート

base_control_excel.py
※パスを書き換えれば動きます。
詳細は別ページで(作成途中)。

#以下の基礎知識をもとにexcelファイル操作プログラムを作成
#Excelファイルを読み込む
import openpyxl
wb=openpyxl.load_workbook("c:/Users/nakam/base_control/excelfile.xlsx")
#シートを読み込む
ws=wb["Sheet1"]
#Excelファイルのセルを読み込む
x=ws["A"+str(1)].value
#Excelファイルのページを新規作成する
a="titlename"
wb.create_sheet(a)
ws_new=wb[a]
   #step2':最後に閉じる
wb.save("c:/Users/nakam/base_control/new_excelfile.xlsx")
print("実行完了")

・Gmailのpythonテンプレート

base_control_gmailpy
base_control_gmailtxt.txtと組み合わせて使います。
※パスを書き換えて、モジュールをインストールする必要がります。詳細は別ページで(作成途中)。

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
#1変数定義
# 自分のメールアドレス
my_address1= ""
my_address2=""
# 送り先のメールアドレス
recieve_address1=""
recieve_address2=""
#多人数送信用リスト※有効なアドレスでないとsmtplib.SMTPRecipientsRefusedが出ます
address_list=[my_address1,my_address2]
#入力を要する変数
input_list=["","","","","","",""]
input_list[0]=input("変数1:")
input_list[1]=input("変数2:")
#input_list[0]=input("starttime(00:00の形で):")
#input_list[1]=input("endtime(00:00の形で):")
#input_list[2]=float(input("勤務時間(例;3.5):"))
#2メール送信内容作成関数
def make_bdytxt(input_list):
   text = open("c:/Users/nakam/base_control/base_control_gmailtxt.txt", encoding="utf-8")
   body_temp = text.read()
   text.close()
   body_text = body_temp.format(value1=input_list[0],value2=input_list[1])
   return body_text
#3送受信者・件名決定関数
def make_msg(reciever,body_text,input_list):
   # メッセージの準備
   msg = MIMEMultipart()
   # 件名、メールアドレスの設定
   msg["Subject"] = "{}".format("")
   msg["From"] =""
   msg["To"] =reciever
   #メール本文の追加
   body = MIMEText(body_text)
   msg.attach(body)
   return msg
#4内容確認関数
def confirm_msg(msg,address_list,body_text) :
   print("\n")
   print("<<内容確認>>")
   print("\n")
   print("<メールタイトル>")
   print(msg["Subject"])
   print("\n")
   print("<メール本文の内容>")
   print(body_text)
   print("\n")
   print("<メール送信先>")
   print(address_list)
   print("\n")
#5メール送信実行関数
def sendgmail(msg):    
   # SMTPサーバー(今回はGmailでの送信)
   smtp_server = "smtp.gmail.com"
   port_number = 587
   server = smtplib.SMTP(smtp_server, port_number)
   server.starttls()
   # ログイン情報(今回はGmailのアカウントを入力する)
   account = ""
   password = ""
   server.login(account, password)
   server.send_message(msg)
   server.close()
#実行
a=address_list
b=input_list
c=make_bdytxt(input_list)
for i in range(len(a)):
   d=make_msg(a[i],c,b)
   if i==0:
       confirm_msg(d,a,c)
       k=input("この内容で良ければ、yを入力してください:")
       if k!="y":
           quit()
   sendgmail(d)
   print(a[i]+"送信完了")

base_control_gmailtxt.txt
メール本文のプログラムです。

<メール本文>
変数は以下のように格納する。
変数1:{value1}
変数2:{value2}

・pdfのpythonテンプレート

bas_control_splitpdfs.py
pdfを分割して関連する名前を各ファイル名にするプログラムです。

#初期設定
import os
import glob
import sys
from pathlib import Path
import subprocess
import PyPDF2
#pdf2txt.pyの場所を指定
py_path ="C:/Users/nakam/AppData/Local/Packages/PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0/LocalCache/local-packages/Python39/Scripts/pdf2txt.py"
#0:結果に関わる設定
print("<分割後ファイル名>_(個人名).pdfのようなpdfを作成します。")
print("名前リストを確認してください。")
print("作成されたファイル名が数字のままの人はリストに登録されていません。")
pdf_file_name= input("Downloadsにある分割対象のpdfファイルを入力してください。:")
pdf_common_name="<ファイル名>"
want_split_pdf_path="C:/Users/nakam/Downloads/"+pdf_file_name
working_directory='C:/Users/nakam/base_control'
part_names=["あ","い","う","佐藤次郎","中村裕也","山田太郎"]
#1:分割対象のpdfファイルが有効なとき新規フォルダをつくる
if os.path.isfile(want_split_pdf_path):
   new_dir_path=working_directory+"/new_dir"+pdf_common_name
   os.mkdir(new_dir_path)
   print(new_dir_path)
else:
   print("分割対象のpdfファイルのパスが無効です。")
   sys.exit()
#2:pdfファイルを分割して作業ディレクトリに保存する
def split_pdf_pages(src_path):
   src_pdf = PyPDF2.PdfFileReader(src_path)
   for i in range(src_pdf.numPages):
       dst_pdf = PyPDF2.PdfFileWriter()
       dst_pdf.addPage(src_pdf.getPage(i))
       with open(new_dir_path+'/{}_{}.pdf'.format(pdf_common_name,i), 'wb') as f:
           dst_pdf.write(f)
           
split_pdf_pages(want_split_pdf_path)
#4:分割したpdfのファイル名を変更する
for new_pdf_file in glob.glob(new_dir_path+"/*.pdf"):
   #pdfファイル中の文字列を抽出
   completedProcess = subprocess.run(["py", str(py_path),"-p1", new_pdf_file], check=True, shell=True, stdout=subprocess.PIPE, encoding="shift-jis")
   #encoding="utf-8"
   #コマンドの実行結果の文字列を変数aに格納
   a=completedProcess.stdout
   #PDF内の文字がPDFから抽出した文字列中にある名前を検索
   for i in range(len(part_names)):
       if part_names[i] in a:
           print(i)
           os.rename(new_pdf_file, new_dir_path+'/{}_{}.pdf'.format(pdf_common_name,part_names[i]))
           break
       else:
           pass
#5:動作確認をすべてコマンドライン上でできるようにする機能
print("実行完了")






この記事が気に入ったらサポートをしてみませんか?