2020-01-01から1年間の記事一覧

JSON loads 実行時の parse_float

JSON loads で文字列JSON を読込む時の、浮動小数点の少数桁は以下の動きをする。 import json from decimal import Decimal jstr = '{"width": 2.01285481238632125743}' dc = json.loads(jstr) print(dc['width']) dc = json.loads(jstr, parse_float=Deci…

with文

Python の with 文のサンプルは、ネット検索するとたくさんあります。 クラスを用意、__enter__ と __exit__ で前処理、後処理を実行する方法 # -*- coding: UTF-8 -*- class Foo(): def __init__(self, msg): self.msg = msg def getMsg(self): return self…

全角文字の平仮名⇔カタカナ変換

文字コード表を使用せず、計算だけで行います。 次の文字は、変換しません。 濁点、合成用 [゙ ]→ '\u3099' 半濁点、合成用 [゚ ]→ '\u309a' 濁点 [゛] → '\u309b' 半濁点 [゛] → '\u309c' よりの合略仮名 [ゟ] → '\u309f' 中点 [・] → '\u30fb' 長音 [ー] →…

ASCIIコード文字の全角変換

半角英数字だけでなく、記号文字、!"#$%&'()*+,-./:;?@[\]^_`{|}~ を含め ASCII コード文字を対応する全角文字への変換、または逆(ASCIIコードへの変換)を 正規表現ではなく、計算で行う処理を Pytnon で書いてみました。 2通りの方法が考えられます。 ・…

string Template クラス

% による文字列のフォーマット出力を書くことが多いが、 string の Templateクラスの機能も 忘れてはならない。テンプレートは、$文字接頭辞 from string import Template t = Template('$a is $b : $c') substitute( テンプレートの対象名=値 、、、) fr…

関数かどうかの型判定

オブジェクトが関数かどうかの判定方法は2通り。・isinstance() で判定する場合は、types の FunctionType で判定 import types f = lambda x:x+1 print( isinstance(f, types.FunctionType) ) # True ・callable() で判定、(呼び出せるかという文字通りの…

dict(辞書)を正規表現で参照する

dict(辞書)の参照、dict[ 正規表現 ] で参照する 場合、dict のサブクラスで以下のようにする。 import re class rdict(dict): def __getitem__(self, key): p = re.compile(key) r = [ v for k,v in self.items() if p.search(k) ] return r if len(r) > …

XPath で dict:辞書を参照

区切り文字 '/' で表現するXPath でdict:辞書を参照するものを作りました。 jsonpath-ng · PyPI ではありません。XPath の書式で配列の何番目かの指定をするインデックス [n] を単独で区切る場合、、 /key/key/[0] と書くのが正しいのか? それとも /key/ke…

JSONDecoder を継承してJSON→任意クラスへの変換

任意クラスをネストした構造への JSON読込みオブジェクト変換は、json.load() の結果のdict:辞書を 丹念にパースすればできますが、膨大なコードを書きたくありません。 json.load() の object_hook でなんとかならないのかと悩みましたが、日付時刻型など…

JSON → Object 変換(構造が単純な場合)

JSON を読込み任意のオブジェクトにする場合、 オブジェクトが単純な構造=ネストで任意の構造のオブジェクトを持たない! という比較的単純な構造の場合に限り、 次のサンプルのように、json.load実行の object_hook を定義して渡すことで解決する。JSONか…

Python プロパティのgettter & setter

クラスのプロパティ getter / setter の定義は2通りある。 ・@property デコレータの方法 ・property関数の定義の方法 ’@’が付くのを デコレータと呼ぶ? → Java に慣れしたんだ筆者はどうしても アノテーションと呼んでしまいそうだ。 @property デコレー…

JSONデシリアライズで、datetime オブジェクトにする。

JSONシリアライズで、datetime を考慮するケースは、 JSONシリアライズで、datetime に注意する - Oboe吹きプログラマの黙示録 を書いたが、デシリアライズする場合も datetime オブジェクトに変換する場合は以下のような メソッドをフックとして実行させる…

datetime への変換

日付時刻文字列から datetime オブジェクトを求めるのに、 正規表現、 日付の正規表現 - Oboe吹きプログラマの黙示録時刻正規表現 - Oboe吹きプログラマの黙示録これらで毎回チェックしてから datetime.strptime を実行するのは面倒くさいです。 Java と違っ…

tuple から dict

問題: a = [ {'name':'A','id':1103},{'name':'B','id':1104},{'name':'C','id':1105} ] ここから {'A': 1103, 'B': 1104, 'C': 1105} を求めたいvalues() で tuple リストを求めて、 a_tuplelist = [ tuple(v.values()) for v in a ] # [('A', 1103), ('B'…

2つの tuple の結合(2)

2つの tuple の結合(1)に続けて、、、 結合元のタプルの要素数=2であるなら、 内包表示で、タプルのインデックスに注意を払えば、もっと簡単に書けるはずで、、 a = [ ('A',1103),('B',1104),('C',1105) ] b = [ ('A','red'),('C','yellow'),('D','blu…

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…