インストール

pip install tabula-py

加えて,Javaが必要なのでJDKをインストールしておくこと.

スクリプト

import tabula
import pandas as pd

pdf = 'pdfファイル名'
dfs = tabula.read_pdf(pdf, pages='all')

for i in range(len(dfs)):
output = 'output_' + str(i) + '.xlsx'
dfs[i].to_excel(output, index=False)

コメント・シェア

gspread

インストール

pip install gspread

インポート

import gspread

ブック

取得

wb = gc.open_by_key('ID')

作成

wb = gc.create('ブック名')

タイトルとIDの取得

wb.title
wb.id

シート

作成と削除

wb.add_worksheet(title='シート名', rows='行数', cols='列数')
wb.del_worksheet(ワークシート)

全てのシートを取得

wb.worksheets()

シート名による取得

ws = wb.worksheet('シート名')

インデックスによる取得

ws = wb.get_worksheet(int型のインデックス番号)

タイトルとIDの取得

ws.title
ws.id

全データの取得

ws.get_all_values()

行・列データの取得

i行(列)の取得は

ws.row_values(i)
ws.col_values(i)

セルの値の取得・更新

ws.cell(i, j).value
ws.update_cell(i, j, '更新内容')

アドレスによるセルの値の取得・更新

ws.acell('A1').value
ws.update_acell('A1', '更新内容')

最終行への追記

ws.append_row(リスト)
ws.append_rows(リストのリスト)

コメント・シェア

Pythonのスクリプトの実行をGUIで行えるようにするには,tkinterを用いる.

雛形

import sys
import tkinter as tk

root = tk.Tk()
root.title(u'タイトル')
root.geometry('600x480') # 画面サイズ

# ボタン等はここに書く

root.mainloop()

テキスト

テキストはLabelで作ることができる.

txt = tk.Label(text=u'説明文')
txt.pack()

自動配置はpackで行われるが,place(x=10, y=20)のように位置を指定することもできる.

ボタン

ボタンで行う処理は別途関数を作っておき,ボタンにbindする.
なお,ここでの<Button-1>は左クリックのこと.

def sample_func(event):
# 省略

btn = tk.Button(text=u'削除', width=50)
btn.bind('<Button-1>', sample_func)
btn.pack()

テキストボックス

テキストボックスはEntryで作ることができる.

txtbox = tk.Entry(width=50)
txtbox.insert(tk.INSERT, '挿入する文字列')
txtbox.pack()

insertの第1引数は挿入位置で,

  • INSERT: 挿入カーソルのあるから
  • END: 最後の文字の後ろから

となる.

クリアは

txtbox.delete(0, tk.END)

のようにする.

チェックボックス

ブール値を格納する変数をBooleanVarで用意し,setで初期値を与える.

bl1 = tk.BooleanVar()
bl2 = tk.BooleanVar()
bl3 = tk.BooleanVar()

bl1.set(False)
bl2.set(True)
bl3.set(False)

chkbox1 = tk.Checkbutton(text=u'チェックボックス1', variable=bl1)
chkbox1.pack()

chkbox2 = tk.Checkbutton(text=u'チェックボックス2', variable=bl2)
chkbox2.pack()

chkbox3 = tk.Checkbutton(text=u'チェックボックス3', variable=bl3)
chkbox3.pack()

チェックボックスを使った関数は別途作り,ボタン等に紐づける.

def checkbox_sample_func(event):
global bl1
global bl2
global bl3

text = ''

if bl1.get() == True:
# 1番目にチェックが入っていたときの処理
else:
# 1番目にチェックが入っていなかったときの処理

# 以下略

ラジオボタン

frame = tk.Frame()
var = tk.IntVar(value=0) # 引数は初期値

radio1 = tk.Radiobutton(frame, value=0, variable=var, text='ラジオボタン名1')
radio2 = tk.Radiobutton(frame, value=1, variable=var, text='ラジオボタン名2')

frame.pack()
radio1.pack()
radio2.pack()

選択されたものはvar.get()で取得する.
たとえば,

def sample_func(event):
global var
# 処理

として,ボタン等と紐づけて使う.

メッセージボックス

予めメッセージボックスをインポートしておく.

from tkinter import messagebox

必要なところで次のようにする.

messagebox.showinfo('見出し', '表示する文章')

アプリ化

cxfreezeを使う場合であれば,

cxfreeze -c hello.py --target-dir dist

の形.

コメント・シェア

macOS13.3でのStable Diffusionの使用例。
パラメータ等をほぼ初期状態にしておいても、本物らしく見える、校正屋さんから見ても異状確認に手間がかかりそうな画像が生成された。

続きを読む

SQLAlchemyでSELECT文を書く

前提

次のクラスをテーブルのための例とする.

class Books(Base):
__tablename__ = "books"
id = Column(String(7), primary_key=True)
price = Column(Integer)
title = Column(Text)
flag = Column(Boolean)

SQLのSELECT文の作り方

SQLAlchemyではレコードの選択をqueryで行い,絞り込んだ上でall等により抽出する.
ここで,filterはSQLのWHERE句に相当する.

セッション名.query(取り出したいもの).filter(絞り込み条件).抽出方法

抽出するレコードの量による抽出方法の違い

all

allは複数ヒットするものに使う.
次の例は,1000円以上の書籍の品番と名前を抽出する.

session.query(Books.id, Books.title).filter(Books.price >= 1000).all()

first

firstは1行に決まるケースで使う.
次の例は,重複しない品番から書籍情報を抽出する.

session.query(Books).filter(Books.id == 'A123').first()

scalar

scalarは1つの値に決まるケースで使う.
次の例は,ある品番の書籍情報のうち,価格だけを抽出する.

session.query(Books.price).filter(Books.id == 'A123').scalar()

DISTINCT

distinctで重複を取り除くことができる.
次は,1000円以上の書籍の価格のリスト.

session.query(distinct(Books.price)).filter(Books.price >= 1000).all()

ORDER BY・LIMIT

価格が高いものから5件を抽出するなら,order_bylimitを使って次のようにする.

from sqlalchemy import desc

session.query(Books.id, Books.title).filter(Books.price >= 1000).order_by(desc(Books.price)).limit(5)

絞り込み条件(filter)

AND・OR・NOT

and_or_not_を使う.
次は1000円以上でフラグがFalseの書籍を抽出する例.

from sqlalchemy import and_, or_, not_

session.query(Books).filter(
and_(
Books.price >= 1000,
Books.flag = False
)
).all()

LIKE

likeを使う.
次は「ネコ」で始まる書名の書籍を抽出する例.

session.query(Books).filter(Books.title.like("ネコ%").all()

BETWEEN

betweenを使う.
次は価格が1000円から2000円の書籍を抽出する例.

session.query(Books).filter(Books.price.between(1000, 2000)).all()

IN

in_を使う.
次は1000円か1200円の価格である書籍を抽出する.

session.query(Books).filter(Books.price.in_[1000, 1200]).all()

コメント・シェア

SQLAlchemyのCRUD

SQLAlchemyの使用例.

インストール

pipからのインストールは次のようにして行う.

pip install SQLAlchemy

エンジン

接続情報を与える.
次はPostgreSQLに5432ポートで接続する情報の記述例.

from sqlalchemy import create_engine

dialect = "postgresql"
username = "USERNAME"
password = "PASSWORD"
database = "DATABASE"
host = "HOST"
port = "5432"
engine = create_engine(f"{dialect}://{username}:{password}@{host}:{port}/{database}")

セッション

エンジンからセッションを作成する.
withでセッションを使っている間にエラーが生じなければコミット,生じたらロールバックするつもりで予め準備しておく.

from sqlalchemy.orm import sessionmaker
from contextlib import contextmanager

SessionMkr = sessionmaker(engine)

@contextmanager
def Session():
session = SessionMkr()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()

テーブル

データベース処理用のクラスを作って,それを継承する.
ここではBooksというクラスを作り,データベースのbooksというテーブルにアクセスするようにした.
テーブル内の列はColumnで定義する.

from sqlalchemy.orm import declarative_base
from sqlalchemy.schema import Column
from sqlalchemy.types import Boolean, Integer, String, Text

Base = declarative_base()

class Books(Base):
__tablename__ = "books"
id = Column(String(7), primary_key=True)
price = Column(Integer)
title = Column(Text)
flag = Column(Boolean)

ここで主キー制約を与えるのにprimary_keyを使用した.
非Null制約にはnullable,一意制約にはuniqueを使う.

追加(SQLのINSERT)

追加したいレコードのインスタンスを作る.

book = Books()
book.id = 'dummyid'
book.title = 'testtitle'

データベースに接続してaddする.

with Session() as session:
session.add(book)

抽出(SQLのSELECT)

レコードの選択をqueryで行い,絞り込んだ上でall等により抽出する.
ここで,filterはSQLのWHERE句に相当する.

セッション.query(取り出したいもの).filter(絞り込み条件).all()

次の例では,1000円以上の書籍の品番と名前を抽出する.

with Session() as session:
data = session.query(Books.id, Books.title).filter(Books.price >= 1000).all()

更新(SQLのUPDATE)

dataに格納したレコードの更新は次のように行う.
次の例では,抽出したレコードについてflag列をTrueに更新する.

with Session() as session:
data = session.query(Books).filter(Books.id == 'A123').first()
data.flag = True

削除(SQLのDELETE)

deleteで削除が実行できる.

with Session() as session:
session.query(Books).filter(Books.id == 'A123').delete()

コメント・シェア

モジュールのインストール

pip install openai

スクリプトのサンプル

次はOpenAI社のQ&Aのサンプルを改変したもの.

import openai

openai.api_key = "OPENAI_API_KEY"

def ask(question):
response = openai.Completion.create(
model="text-davinci-003",
prompt=f"Q: {question}\nA:",
temperature=0,
max_tokens=100,
top_p=1,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["\n"]
)
answer = response.choices[0].text.strip()
return answer

コメント・シェア

openpyxlで画像を扱う

openpyxlで画像の入ったExcelを扱うには,Pillowがインストールされた環境であることが必要です.

インポート

from openpyxl.drawing.image import Image

画像の挿入

img = Image('ファイル')
ws.add_image(img, 'A1')

リサイズ

original_ratio = img.height / img.width
img.width = 512
img.height = int( original_ratio * img.width )

コメント・シェア

discord.pyでエラーが出た

エラー1

次のエラーが出た.

TypeError: Client.__init__() missing 1 required keyword-only argument: 'intents'

intentsを指定しないといけない.

対処

discord.Client()

discord.Client(intents=discord.Intents.all())

に修正した.

エラー2

SSLCertificateErrorと見えるなにかの長いエラーが出た.

対処

ターミナルでPythonの証明書を更新した.

/Applications/Python\ 3.10/Install\ Certificates.command

コメント・シェア

セパレータ

osモジュールをインポートすると,os.sepでセパレータを取得できる.

ディレクトリ・ファイル名の取得

dir, file = os.path.split('/path/to/file')

拡張子の取得

root, ext = os.path.splitext('/path/to/file')

パスの取得

  • 絶対パス:os.path.abspath('パス')
  • 相対パス:os.path.relpath('パス', '起点')

パスの存在確認

  • os.path.exists('パス')
  • lsコマンドに当たるのはos.listdir('パス')
  • mkdirに当たるのはos.makedirs('パス')
  • 判定用にos.path.isdir('パス')os.path.isfile('パス')がある.

削除

  • ファイルの削除はos.remove('パス')で行う.
  • ディレクトリはshutilモジュールをインポートしてからshutil.rmtree('パス')で.
  • mvに当たるのはshutil.move('パスfrom', 'パスto')

コメント・シェア

PyAutoGuiはマウスやキーボードによるGUIでのPC操作をスクリプトで指定した通りに実行することができるPythonのライブラリです.
アプリケーションをまたいでドラッグしたり,Shiftキーを押しながら何かのキーを押すといった操作を自動化することが可能となります.

続きを読む

openpyxlでExcel出力

カテゴリー 原稿整理

openpyxlはExcelの読み書きを行うためのPythonのライブラリです.
csvを用いてxlsx形式のファイルを自動出力させたいときに特に有用です.
ここではいくつかの機能について記します.

続きを読む
  • page 1 of 1
著者の絵

ねこせんせい

One cat just leads to another.
(Ernest Hemingway)


色鉛筆塗り


校正室