tse サンプル

tse(Python Stream Scripting) サンプル集

ImageMagikでpng画像をjpegに変換

png画像を検索し、jpegに変換する。このとき、横幅が1500px以上なら1500pxに縮小する。

find . -name '*.png' | tse -s "" 'p=Path(L);j=p.with_suffix(".jpeg");P(fr`convert {p} -resize "1500x>" {j}`)'

拡張子別にファイルの件数と合計サイズを出力

find . | tse -ms collections,pprint -
Pythonのhasattr()は遅い?

Pythonには、オブジェクトにある名前の属性が存在するかどうかをチェックする hasattr という組み込み関数があります。

例えば、リストオブジェクトに append という属性が存在するかどうか確認するときは、次のようにかきます。

In [57]:
L = []
print(hasattr(L, 'append'))
print(L.append)
True
<built-in method append of list object at 0x7fbc80542d80>

リストオブジェクトには append という属性が存在し、メソッドだということ

Pythonを闇改造して辞書リテラルのキー名や関数呼び出しの引数名を省略できるようにしてみた

先日、Pythonを闇改造した でPythonにちょっとした改造を加えてみました。

この修正は、

def register_user(first, last, addr1, addr2):
    d = {'first': first,
         'last': last,
         'addr1': addr1,
         'addr2': addr2,
         'tel': '123-456-789'}

    requests.post(URL, d)

のようなコードを、JavaScriptの

d = {first, last, addr1, addr2, tel:'123-456-789'}

のように、

d = $

[Python] jashin.dictattrで辞書の要素を属性値として参照する

Pythonで辞書データをたくさん扱うコードを書いていると、辞書の要素をオブジェクトの属性みたいに参照したくなることがあります。

Javascriptなんかだと、辞書でも

data = {
    'name': 'value'
}

alert(data.name)

のように、辞書.名前 で参照できますが、Pythonの場合は

data = {
    'name': 'value'
}

print(data['name'])

となり、数が多いとちょっと面倒になります。

ありがち

Github actionでvenv環境をキャッシュする

これまで、PythonのプロジェクトでGithub Actionを使うとき、こんな感じで仮想環境ごとキャッシュしていました。

# 仮想環境を作成
  - name: Create venv
    run: |
      python3 -m venv .venv

  # 仮想環境をキャッシュから復元
  - name: Cache venv dependencies
    uses: actions/cache@v1
    with:
      path: .venv
      key: venv-${{ runner.os }}-${{ hashFiles('requ
PyArrowとParquet

さて、ビッグデータ全盛の昨今、数ギガバイト程度のデータのやり取りは珍しくもなんともない時代になりました。交換用データファイルのフォーマットもいろいろな形式が使われていますが、ここではPythonで一般的に使われているファイル形式を簡単に検討してみましょう。

CSV

昔から、単純な表形式のデータにはCSVが使われてきました。Microsoft Excelをはじめとしてさまざまなツールでサポートされており、幅広い環境で利用できます。

データの作成

例として10万行・100カラムのデータを作成し、CSV形式で保存してみ

asyncioのTaskに関する基礎知識

pythonのslackclientで非同期タスクを実行したらValueErrorになった話 で、たぶん asyncioのtaskを勘違いしてる気がするので簡単に解説。

要は asyncio.run にコルーチンではなくてTaskを渡したらエラーになった、という話ですが、このページでは、

Taskオブジェクト(asyncioが内部的にloopに委ねるときにwrapするオブジェクト)

と書かれていて、Taskオブジェクトをちょっと誤解している感じがします。このTaskの役割を理解したら納得がいくのではないかと思います。

まず

WindowsでCapsLockキーをCtrlに変更するPythonスクリプト

管理者として実行してください。

import winreg

key = 'System\CurrentControlSet\Control\Keyboard Layout'
scancodemap = (b'\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00'
               b'\x00\x00\x1d\x00:\x00\x00\x00\x00\x00')

with winreg.OpenKey(winreg.HKEY_LOCAL_MA

[Python] 正しくない global の使い方

Pythonは名前だらけでは、Pythonの変数も関数も結局はみんな名前、という解説をしました。この特徴を使って、Pythonのちょっとおもしろい挙動を調べてみましょう。

Pythonの変数には、グローバル変数とローカル変数があります。関数の内部で定義した変数はローカル変数、それ以外はグローバル変数となります。

global_var = "これはグローバル変数です。"

def func():
    local_var = "これはローカル変数です"

グローバル変数は同じモジュール内なら

Pythonは名前だらけ

He would answer to "Hi!" or to any loud cry,
Such as "Fry me!" or "Fritter my wig!"
To "What-you-may-call-um!" or "What-was-his-name!"
But especially "Thing-um-a-jig!"

Pythonでもなんでも、プログラムを書くといろんな名前が出てきます。変数名や関数名、クラス名にモジュール名。

次のコードは、100 という数値に、number という名前をつけます。

In [32]:
numb

JupyterLab CMS化計画

私が管理するこのサイトや python.jpMiyadaikuというSSGを使って構築しています。

記事の執筆は普通にエディタを立ち上げてMarkdownやreStructuredTextで書いていましたが、最近、JupyterLab を使うようになってきました。MiyadaikuはJupyter NotebookからHTMLを作成できるようになっており、私が書くブログ記事の執筆には最適なPythonの実行・ドキュメント環境です。

Notebook以外にも、Preview付きMar

Pythonを闇改造した

思いつきをざっと書いて公開してしまうシリーズ2

Python 3.10 ではこれまでPythonのコンパイルの仕組みが変わり、従来の貧乏くさいLL(1)パーザから PEGパーザに切り替えられる予定になっています。

新パーザはすでにPython3.9に含まれていて、現在のPython 3.9b1でも試せるようになってますので、早速試してみました。

https://github.com/atsuoishimoto/cpython/pull/2

JSON Literal

Pythonのプログラムを書いていて、辞書オブジェクトを書くの

pastecat: クリップボードの画像をファイルに出力するツール

思いつきをざっと書いて公開してしまうシリーズ

クリップボードにコピーした画像を、ファイルに出力するPython製コンソールコマンド pastecat を作りました。

画像を、PNG形式で from_clipboard.png というファイルに出力するときは、

$ pastecat from_clipboard.png

とします。ファイル形式は、出力ファイルの拡張子で決定します。

画像を標準出力に出力するときは、-f オプションでファイル形式を指定します。

$ pastecat -f JPEG > from_clipboard.jpeg

インスト

静的サイトジェネレータ miyadaiku

このサイトは、静的サイトジェネレータ Miyadaiku で作っています。

miyadaikuは以前からJupyter Notebook からページを作成する機能を持っていましたが、あたらしくMiyadaikuのテーマを作成し、普通のブログっぽくノートブックを表示できるようにしてみました。

CSSを多少いじくって、Jupyterっぽさを隠しています。

このページもノートブックです。

先日、雑誌 Software Designの記事 を書かせていただいたとき、数十ページの原稿をすべて Jup

初投稿

新しいブログの、記念すべき初投稿です。

さしあたって、Python の小ネタをどうぞ

Python 3.8.2 (default, Mar 11 2020, 00:29:50)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import braces
  File "<stdin>", line 1
SyntaxError: not a chance
1