Python

2つの tuple の結合(1)

先日は、dict リスト の結合だったので今度は、tupleリストの結合 a = [ ('A',1103),('B',1104),('C',1105) ] b = [ ('A','red'),('C','yellow'),('D','blue') ] 先頭インデックス [0] をキーとして結合する。 それぞれキーのdict を用意する a_dict = { t[0…

2つの dict の結合

DBのように、2つの dictionary リストの結合(LEFT JOIN)をする。2つの dictionary のリスト a = [ {'name':'A','id':1103},{'name':'B','id':1104},{'name':'C','id':1105} ] b = [ {'name':'A','color':'red'},{'name':'C','color':'yellow'},{'name'…

format関数で金額桁区切りを表示する

Python の format関数で置換後の幅を指定する方法は、 {:n} と、: の後に幅 n を指定する。 print('1234567890') print('{:5}'.format('A')+"-") # 1234567890 # A - となる。数値を千の単位で、カンマを差し込む時は、 {:,} print('{:,}'.format(123456)) #…

Python 正規表現置換でリストによる置換を考える

Python で、 str = '"1": "orange", "2":"lemon", "3":"apple"' alist = [ 'A', 'B', 'C' ] このように str に対する正規表現 [a-z]+ にマッチする置換を リスト alist で順に置換したい。 期待値は、、 "1": "A", "2":"B", "3":"C" Python の正規表現・置換…

itertools の groupby

あるリストをグルーピングするのに、便利な標準ライブラリ itertools の groupbyこれを使用するには、事前に対象をグルーピングするキーでソートしてしておかなければならない。 from functools import reduce from itertools import groupby users = [ { "k…

reduce でリストの重複有無をチェックする

高階関数 functools.reduce(function, sequence, initial=None) は、 リストの存在チェック in Iterable の代用に書けますが、 わざわざ in Iterable の代わりに以下のように書くことはありません。 from functools import reduce list = ['a','b','c','d','…

JSONシリアライズで、datetime に注意する

datetime 型、date型を含むオブジェクトを JSONシリアライズしようとして、 AttributeError: 'datetime.datetime' object has no attribute '__dict__' が発生するのを回避する場合、 json.dumps メソッドの default メソッドで以下のシリアライズメソッドを…

クラスインスタンスを JSONシリアライズする

class User: def __init__(self, name, age, address): self.name = name self.age = age self.address = address class Address: def __init__(self, city, street, pin): self.city = city self.street = street self.pin = pin address = Address("Tokyo"…

(Python基礎)クラス定義でよく使いそうなもの

今更、Python 初心者向けのこと。 *変数、**変数、渡し → 可変長タプル渡し → 辞書渡し __eq__ → == 演算子実行時の処理、is では効かない __str__ → print や、%s の出力で実行される処理 class Foo(): name = 'foo' def __init__(self, *args): if len(arg…

reduce で dictionary を生成

高階関数の計算、reduce() の学習は腐るほどいろんなサイトで紹介されているので 集計によって求める sum 等はそれらを検索すれば良いでしょう。reduce の initilizer に dictionary を指定して、リストを走査して 新しい dictionary を求めたい。簡単な理解…

Python 重複リストを操作する時に覚えておくといいもの

リストに重複要素があるかどうかの真偽値 names = [ 'b', 'c', 'a', 'd', 'e', 'b', 'f', 'c' ] if len(names) > len(set(names)): print('list に重複要素がある') set(list) で重複を場外したリストの数と リストそのままの要素数を比較する方法重複してる…

郵便番号検索API(XML)をPythonで問い合わせる。

XML で結果返す、郵便番号検索API http://zip.cgis.biz/ は、古くからあるAPIであるが、 Python の xml 解析 xml.etree.ElementTree を学ぶのに丁度よい題材である。API サービス、今や JSON の方が主流で、今更、XMLでレスポンスするものなど。。。 http…

Python のロギングを使いやすく。

過去に何度も書いたが、改めて書き直すことにした。 設定ファイルと、logger.py という logging を書いたスクリプトで構成する。JSON で記述する設定ファイル(logsetting.json というファイル名)で、 Logger 生成で引数 name に対する以下属性を設定する。…

実行中のスクリプトファイルのパス__file__を使う時、

__file__ は、実行中のスクリプトファイルのパスを取得するわけだが、 python 実行中のスクリプトファイル絶対パスと実行する時は、パスもフルPATH を取得できるが、スクリプトの場所に カレントディレクトリを移動して python 実行中のスクリプトファイルで…

Pythonで、Jsonの値に改行が存在する場合に読み込む時の注意

Json の値に改行、など制御文字 '\t'、'\n'、'\r' 等、0 から 31 までの範囲のコードを 読む時に、 そのまま通常の読み方をすると、 json.decoder.JSONDecodeError: Invalid control character になってしまう。 これを回避するには、json.load を、strict=F…

ヘッダキーによるCSV読込み参照

Python でヘッダ行有りのCSVを読込んでいて、コンテンツ行の値をヘッダで記述された各々のキーで 参照したい場合がある。 pandas を使えば簡単かもしれないが、pandas を使わないケースで考えてみる。サンプルCSV:UTF-8 、BOM があるかもしれない。 A, B, C…

Python の zip関数でfor文中にインデックスをつける

for v in ~ を書いていて、forループ内で展開された値の他にループカウンタ orループインデックスが欲しい時がある。range() でリストの長さ len() と、リストを zip() でまとめれば良い。 alist = ['A','B','C'] for v,i in zip(alist, range(len(alist)))…

初心に帰って、lambda

Pythonで、以下のようなリストある時、 items = [{'name': 'A', 'type': 'string'}, {'name': 'B', 'type': 'int'}, {'name': 'C', 'type': 'bool'}] ここから、'name' キーの値を準備に並べて次のリストを求めたい。 ['A', 'B', 'C'] 初心者がすぐ書きそう…

JSON文字列に日付時刻がある時、Python での datetime へのデシリアライズ

json の loads 実行時に、object_hoo= で、日付書式に従った datetime.strptime を実行するように するしか方法がないみたいだ。つまり状況によって、日付時刻フォーマットをに沿った変換処理ハンドラを指定するしかない。 # -*- coding: UTF-8 -*- from dat…

辞書ー>JSON における datetime

Python の json dumps() と dump() は、対象の辞書、Dictionary に、datetime を含んでると TypeError: Object of type 'datetime' is not JSON serializable でシリアライズできません。dumps の default= 属性で変換用のハンドラを指定して置換えないとな…

isinstance が良いのか、hasattr が良いのか?

興味深い議論を stackoverflow で見つけましたexception handling - python isinstance vs hasattr vs try/except: What is better? - Stack Overflow以外にも、try~except: を使う方が Python 言語として良いとされてます。 でもコード可読性、それから、…

ファイルの日付時刻を変更する

Python スクリプトでファイルの日付を変更するメモ os.utime で、ファイルのアクセス時刻と更新時刻を変更する。 作成時刻は、OS依存で Windows なら win32_setctime パッケージ # -*- coding: UTF-8 -*- import os import pathlib from datetime import d…

TimedRotatingFileHandler の勘違い

Python logging の TimedRotatingFileHandler の指定でうっかり間違った指定をしてしまいがち、when で指定する値に、'D' を指定しても、インターバルである 24時間経過しないと ローテーションされるわけないのである。MIDNIGHT を指定しないと想定の日替わ…

logging 時刻ローテーションファイル名の変更

Python の logging 、TimedRotatingFileHandler では、日替わりローテーションの場合、 ログファイル名=test.log に対して、 test.log.%Y-%m-%d がデフォルトのローテーションファイル名である。 これを test_%Y-%m-%d.log に変える方法は、、 handler の n…

OSの判定

Python ログ、標準の logging - Oboe吹きプログラマの黙示録 で書いた、 import sys from pathlib import Path sys.path.append('%s' % Path(__file__).parent.parent.resolve()) from blue.logger import Logger Windows は、PyCharmで実行時のスクリプトPA…

Python ログ、標準の logging

以前、 Python ログ出力 logging iniファイルを使用しない - Oboe吹きプログラマの黙示録 を書いたが、隣接のサブディレクトリから使用する場合、呼出し側をきちんとインポートしないと、 ValueError: attempted relative import beyond top-level package …

日付のリスト

timedelta を使って作成する日付リスト from datetime import datetime, timedelta # 指定日から7日間のリスト dlist = [datetime.strptime('2020-10-28', '%Y-%m-%d') + timedelta(days=i) for i in range(7)] # 検証 list = [d.strftime('%Y-%m-%d') for …

re の flags

Python の標準正規表現操作 re で、 先頭:^ 末尾:$ を想定どおりに働かせる場合は、フラグ MULTILINE を指定する。 flags=re.MULTILINE例えば、末尾に、カンマ文字 ',' と数字、カンマと数字の間に空白がある可能性があるものを 除去したい時は、 res = re…

Python でCSVを読む時の注意

Python では、CSVを読む時、カンマ区切りの後に空白があると読込んだ後に列がズレたり、 (最終列の前のカンマの後に空白が存在して最終列がダブルクォートで括って改行が含まれていると、 次の行と一緒に列の認識が崩れる!) 想定しない障害になります…

subprocess.Popen で Java System.in にデータ渡す。

subprocess.Popen の communicate に文字列をセットして実行する Java Class の System.in に入力させてみる。 Java のクラス(実験用なので simple) package org.talking; import java.util.Arrays; import java.util.Scanner; import java.util.concurren…