Python

リストの最後、最大値

リストの最後、の見慣れない求め方 *_, last = [1, 3, 2, 6, 25, 2] print(last) functools の reduce でリストから最大値を求める res = functools.reduce(lambda a, b: a if a > b else b, [1, 3, 2, 6, 25, 2])

フィルタの方法、内包表記、filter、itertools.filterfalse

対象リスト l1 = [3, 1, 9, 13, 10, 8, 17, 2] 10 より大きいリストを求める。内包表記を使う l2 = [e for e in l1 if e > 10] filter を使う l2 = list(filter(lambda x:x > 10, l1)) itertools.filterfalse を使う import itertools l1 = [3, 1, 9, 13, 10…

itertools で、順列、組み合わせ

順列:Permutation import itertools po = itertools.permutations(['A', 'B', 'C'], 2) print(type(po)) plist = list(po) print(plist) for v in itertools.permutations(['A', 'B', 'C'], 2): print(v) <class 'itertools.permutations'> [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C')</class>…

Python でデカルト積(直積)

簡単なデカルト積を作るサンプル itertools をインポート import itertools product( 要素リスト, ,,, ) で生成する。 作成されるのは、イテラブル・オブジェクト list1 = ['A', 'B'] list2 = [1, 2, 3] products = itertools.product(list1, list2) print(p…

Pandas CSV行番号、列番号でデータを取得する

DataFrame [] スライスで取得したい行を取得 取得した DataFrame の values で numpy.ndarray を取得して、 (values取得で多次元配列 ndarray は、2次元配列だから[0]で1行分を取得) tolist() でリストに変換例)注意:CSV先頭行はヘッダ行で、データ行…

Pandas を使って重複のあるCSVから重複行を取り除いたCSVを生成する

任意の列項目で重複があるCSV 先日のサンプル ⇒ Pandas を使ってcsv 任意の列で重複するキーの組み合わせを求める。 - Oboe吹きプログラマの黙示録 にあるようなCSVから、 重複行を取り除いたCSVを生成する。DataFrame に対して drop_duplicates(subset=[ 重…

pandas を使った重複有無の判定

先日書いたのは、CSVでどのような重複があるかを調査するものだった。 Pandas を使ってcsv 任意の列で重複するキーの組み合わせを求める。 - Oboe吹きプログラマの黙示録重複有無のだけを判定する方法をまとめた。先日の Pandas を使ってcsv 任意の列で重複…

Pandas を使ってcsv 任意の列で重複するキーの組み合わせを求める。

サンプルのCSV 品名 産地 単価 数量 キャベツ 群馬県 219 120 コシヒカリ 新潟県 3350 20 小松菜 茨城県 198 40 キャベツ 群馬県 209 80 りんご 長野県 224 100 小松菜 茨城県 188 90 キャベツ 神奈川県 210 70 キャベツ 群馬県 224 100 '品名'と'産地'が重…

__iter__() の実装例、日付繰り返し

__iter__() イテレータの実装例日付の開始と終了から1日ずつの datetime.date を返すイテレータ class Datedayrange: import datetime def __init__(self, start_date: datetime.date, end_date: datetime.date): if start_date > end_date: raise ValueErr…

Unicodeエスケープされた文字列

\uXXXX という書式、Unicodeエスケープされた文字とASCII文字だけの文字列 を例にする。 \u3042\u3044\u3046\u3048\u304a_%abc123_\uff76\uff77\uff78\uff79\uff7a Python では、\uXXXX 書式文字列は、\をエスケープして文字列として持つことになる。 ustr =…

UTC時刻の取得と日本時間

datetime.timezone.utc でUTCタイムゾーン時刻を取得します datetime.timedelta で日本のタイムゾーン時刻に変換 from datetime import datetime, timezone, timedelta # UTCタイムゾーンの現在時刻を取得 dt = datetime.now(timezone.utc) # 日本標準時(JS…

Python でTeams のメッセージ送信

こんな方法あるんですね。 zenn.dev でも、廃止なんだ、、、 代用はあるみたい blog.devplatform.techmatrix.jp

lambda関数、map関数

Python の基礎のおさらいです。map関数 map object というイテレータを生成します。 書式:map(callable, iterable)map(lambda 引数: 戻り値, iterable(listやdictなど)) 例) m = map(lambda x: x*2, [1, 2, 3]) print(type(m)) <class 'map'>つまり、 for i in map(lamb</class>…

MySQL用の Excel から INSERTーSQL文を作る

Oralce用、PostgreSQL用を書いたので、MySQL用を用意しました。mkInsertMySQL.py # -*- coding: utf-8 -*- # TRUNCATE して INSERT する SQLも生成 import datetime import openpyxl import sys import os # MySQL用 INSERT 作成 class MakeInsertSQL(object…

PostgreSQL用の Excel から INSERTーSQL文を作る

Oralce 用を書いたので、PostgreSQL用を用意しました。mkInsertPostgreSQL.py # -*- coding: utf-8 -*- # TRUNCATE して INSERT する SQLも生成 import datetime import openpyxl import sys import os # PostgreSQL用 INSERT 作成 class MakeInsertSQL(obje…

【再興】Oracle複数行INSERT をExcelから、Python でSQL文を作る

oboe2uran.hatenablog.comこれを考慮して、去年作成したOracle用のINSERT-SQL 作成ツールを書き直す。Excel の日付書式、年月日のみは、DATE型、時分秒が付く時は TIMESTAMP に 対応するように作り直した。 mkInsertSQLforOracle3.py # -*- coding: utf-8 -*…

Openpyxl で読み込んだ日付のセル

Openpyxl で、Excel ファイルを読み込んだ時、 日付時刻のセルの値は、Excel の書式上(Excelでの表示上)で、 日付のみであろうと、時分秒を表示した日付時刻であろうと、 つまり、yyyy-mm-dd のExcel表示であろうと、yyyy-mm-dd HH:mm;ss の表示であろうと…

FastAPI でダウンロードするサイトを作る

(1)動的にダウンロードするコンテンツを作成してダウンロードさせる場合例)CSVを生成→ダウンロード from fastapi import FastAPI, Response app = FastAPI() @app.get("/download") def csvget(): content = '"あ","い","う"\n"1","2","3"' filename …

DNS参照するメールアドレスチェック

正規表現だけでメールアドレスチェックをして良しとするのは あまり良くない。 メールアドレスが指すドメインだけでも、DNSサーバに問い合わせたい。 Java の場合、 以下を参考に、DNS lookUp で検証する。 https://docs.oracle.com/javase/jp/6/technotes/g…

Python のメールアドレスチェック

pydantic の EmailStr を使用したバリデーションチェックは https://github.com/JoshData/python-email-validator が使用されているのだが、EmailStrは、 "名称" <address@domain> の形式を受け付けてくれる。 from pydantic import BaseModel, EmailStr, ValidationError cl</address@domain>…

FastAPI HTML レスポンス

ここまでくると、Flask 、 django なんかなくたって、FastAPI で事足りる気がしてきた、fastapi.tiangolo.comqiita.com qiita.com fastapi.tiangolo.com静的Webページアクセスの為の static 等は、 例えば、以下のディレクトリ構成である場合root ├─ main.py…

Pydantic の SecretStr

ログ出力など通常の表示のための出力やデータダンプで隠蔽させたい プロパティを定義するのに、Pydantic の SecretStr は有効な方法です。 from pydantic import BaseModel, SecretStr class Item(BaseModel): password: SecretStr item = Item(password='ws…

pydantic を使う

FastAPI で使う場面でなくても、SQLAlchemy や、いろんな場面でも使えるし むしろ使った方が良いと思う pydantic 公式マニュアルは、→ https://docs.pydantic.dev/latest/必要なインポート from pydantic import BaseModel, ValidationError サンプル class …

FastAPI 例外のハンドラ

先日書いたリクエストバリデーションのハンドラではなく、 (https://oboe2uran.hatenablog.com/entry/2024/05/25/201834) リクエストを処理している時に発生する例外を独自で定義して そのハンドリングをする。 結局、「リクエスト不正」を意味する 400 を…

FastAPI のリクエストで正規表現

pattern で正規表現を指定すれば良い。全角カナの正規表現、必須の例 Field で pattern を指定 from pydantic import BaseModel, Field from fastapi import FastAPI class Item(BaseModel): name: str=Field(description="品名") kana: str=Field(descripti…

Python で CSVを読み込む

緩すぎる規定の RFC4180 だけのルールで厳しい場合がある。 csv.reader と csv.DictReader の引数で読込みオプションをいろいろ指定できるが、、、 quotechar='"' 括り文字、すなわち、デリミタ、quotechar 、改行、特殊文字を囲む時の1文字doublequote=Tru…

FastAPI ファイルアップロード

python-multipart がインストール済であることが前提です。チュートリアルを見て作ったサンプルです。2通りです import uvicorn from fastapi import FastAPI, File, UploadFile import csv from io import StringIO app = FastAPI() @app.post("/upload1")…

FastAPIのバリデーションエラーのレスポンスメッセージをYAMLで

FastAPI HTTP 422 エラーの時のレスポンスを定義する。 - Oboe吹きプログラマの黙示録 の方法や、 APIRouter を使った時のエラーハンドリング - Oboe吹きプログラマの黙示録 の方法でも、 RequestValidationError のレスポンスパターンに沿って返すメッセー…

APIRouter を使った時のエラーハンドリング

FastAPI で、APIRouter を使った時のバリデーションエラーハンドリングを メインのスクリプトで FastAPI() で、include_router(router: APIRouter) するのと同時に FastAPI の exception_handler を書く方法だと、APIRouter で折角、ルート毎に書いていても …

SQLAlchemy の Session を context manager で

SQLAlchemy のセッションの close 漏れを避けるために context manager で管理する。 つまり with文で必ず close を機能させる。PostgreSQLを使用した時の以下のスクリプト、他のDBでも同様に 用意すると良いであろう。database.py # -*- coding: utf-8 -*- …