上田隆一の仕事とか

なお、このサイトはbashでできている。

お知らせ: 日本機械学会教育賞を拝受いたしました /  詳解確率ロボティクス第5刷出ます /  シェルスクリプト高速開発手法入門改訂2版発売中 / 

opyの便利な使い方集

Thu Jul 1 15:53:35 JST 2021 (modified: Sat Jul 3 09:16:33 JST 2021)
views: 232, keywords:

  このエントリーをはてなブックマークに追加 

opyって何?

opyは、ワンライナーでPythonを使うためのラッパーコマンドです。

電卓として使う

 evalで文字列を評価するとできます。

若干補足すると、F0には、毎行読み込んだ文字列が入ります。[ ]はPythonのリストで、リストの中に処理を書いておくと、上の例のように処理結果がprintされます。mathは自動でimportされます。

基数変換(n進数→m進数)

n進数→10進数

 接頭辞がついていれば、内部で自動的に整数に変換され、printすると10進数で表示されます。

補足: F1は読み込んだ行の1列目の文字列が入ります。文字列が数字として解釈できる場合、自動的に数字に変換されます。

 接頭語がなければ、つけてから処理しましょう。(sedでやるべきですが。)

10進数→n進数

n進数→m進数

上のふたつのパターンの組み合わせです。

YAML/JSON/XML形式のデータの読み込み/編集

 いずれも、入力全体を読み込んでパースし、辞書Tにセットします。次は、JSONの処理の例です。

YAMLの例です。

XMLの例です。xml.etree.ElementTreeを使っており、JSONやYAMLの場合とは少し扱いが異なります。

CSVファイルを扱う

 ふたつ方法があります。

毎行処理する

 -cを使います。

$ echo 'a,b,c' | opy -c '[F2]'
b
### エスケープだらけでも大丈夫 ###
$ echo 'a,"""b,,,,""""",c' | opy -c '[F2]'
"b,,,,""

この方法は、データの中に改行がある場合には使えません。

$ echo -e 'a,"b\nc",d'
a,"b                      <-「b改行c」がひとかたまりのデータ
c",d
$ echo -e 'a,"b\nc",d' | opy -c '[F2]'
b
d          <-ここはcと出なければならないが、出てこない

全体を読んで処理する

 -t csvを使います。T[m][n]mn列目のデータが取得できます。mnは0から始まります。

$ echo -e 'a,"b\nc",d'
a,"b                      <- -cでは扱えなかったデータ
c",d
$ echo -e 'a,"b\nc",d' | opy -t csv '[T]'
{0: ['a', 'b\nc', 'd']}                            <- 改行がデータの一部として認識されている
$ echo -e 'a,"b\nc",d' | opy -t csv '[T[0][1]]'    <- 0行1列目を出力
b
c               <- -cのときと異なり、「b改行c」がデータとして出力される
### 改行を別の文字に置き換える例 ###
$ echo -e 'a,"b\nc",d' | opy -t csv '[T[0][1].replace("\n","@")]'
b@c

XLSXファイルを扱う

 -t xlsxで、PandasのデータフレームがTにセットされます。標準入力からデータを流し込むのではなく、ファイル名を引数に指定して使ってください。

シートの出力

 シートはT["名前"]で取り出します。

### Sheet1のデータフレームをaという2次元のリストに変換 ###
$ opy -t xlsx '{a = T["Sheet1"].values};[a]' ./testdata/test.xlsx
[[123 datetime.datetime(2021, 1, 1, 0, 0) nan]
 ['危険シェル芸' 'ドラゴン曲線' nan]
 ['キュアエンジニア' '素数' nan]
 ['エ"ク"シ"ェ"ル"芸' '変,態,シ,ェ,ル,芸' nan]
 [1 2 3.0]
 [nan nan nan]]
### リストに変換しない場合、1行目と1列目に、それぞれ列、行のラベルがつく ###
$ opy -t xlsx '[T["Sheet1"].to_csv()]' ./testdata/test.xlsx 
,0,1,2
0,123,2021-01-01 00:00:00,
1,危険シェル芸,ドラゴン曲線,
2,キュアエンジニア,素数,
3,"エ""ク""シ""ェ""ル""芸","変,態,シ,ェ,ル,芸",
4,1,2,3.0
5,,,

1個のセルの内容の抜き出し

 データフレームからのデータを取り出すときは、列を先に指定することに注意しましょう。

### 左上(A1)のデータを取り出す ###
$ opy -t xlsx '[T["Sheet1"][0][0]]' ./testdata/test.xlsx 
123
### A2(0列1行目)のデータを取り出す。列を先に指定 ###
$ opy -t xlsx '[T["Sheet1"][0][1]]' ./testdata/test.xlsx
危険シェル芸
### リストに変換した場合は行を先に指定 ###
$ opy -t xlsx '{a = T["Sheet1"].values};[a[1][0]]' ./testdata/test.xlsx
危険シェル芸






このサイトではGoogle Analyticsやその他ソーシャルボタンのためにCookieを使用しています。もし同意いただけない場合はブラウザでクッキーを無効にして閲覧をお願いします。This site uses cookies for Google AdSense and some social buttons. If you cannot accept our use of cookies, please disable cookies on your browser.