too late amatuar programmer
Showing posts with label python. Show all posts
Showing posts with label python. Show all posts

[python] 辞書にmap()のような走査関数を適用したい

2011-06-30 by ebon | Lavel: 0 comment

pythonを使っているとやたらと辞書を使うようになる。
そしてmapの写像という概念を心地よく感じる人間は、辞書に対して近しい走査関数がないかと思うようになる。

ここでは例として、「辞書の全ての値をunicodeに変換する」という問題を例に考えてみたい。
アプローチとして、自前の簡易版とfunctionalモジュールのmapdictの紹介をする。

[python] csvモジュールのDictWriter使用時にヘッダーを挿入したい

2011-06-29 by ebon | Lavel: 0 comment

pythonのcsvモジュールのDictReader,DictWriterは便利で、よく使っている。
直感的に値操作できるので、とかく原始的である、csv利用場面に少しの安らぎをもたらす。
文字コードに悩まされる場面が多いと思うが、それはどこでも付き物かな。

そんな頼もしい輩、DictWriterを使用した時、期待を裏切られた。
単にfilednamesと書き込む辞書データを渡しただけでは、ヘッダーが挿入さないという。
かつ、方法もドキュメントではぱっと見、明示されていない。なのでメモ。

[python] PyLitの使い方少し

2010-11-04 by ebon | Lavel: 0 comment

前回の記事で比較・紹介した、文芸的プログラミング用ツール:PyLitの使い方を少し書いておく.

始めよう

この手のツールは解説を読む前に、とにかく始めてしまうのが効率良い方法だ.
また幸い、単にファイルを置くだけなので,インストールでつまずく要素もないと思う.

インストール方法

Downloadリンク先のファイルを、pathの通ったデリレクトリに置くだけ.

[python] 一度に複数のパターンを置換する関数(正規表現を置換前文字列とできる版)

2010-10-30 by ebon | Lavel: 0 comment

一度に複数のパターンを置換したい場合がある。
その場合、pythonクックブックの同名レシピが参考になる.

そのレシピでは、以下のように、1パスで対応できることに意義を置き、問題が定義されている.
単一の文字列の中の複数の文字列パターンを、同時に(1パス)で置換したい
それに対する解法・考察として、以下3パターンが書かれている.

  • シンプルな例
  • クロージャーを用いた例
  • オブジェクトを用いた例

よくある同問題について、問題と対策について分かりやすく記述されており、このレシピは大いに参考になると思う.

[python] 文芸的プログラミングツール:PweaveとPyLitの比較

2010-10-11 by ebon | Lavel: 0 comment

前回の記事で、python用文芸的プログラミングツールをピックアップし、そして、PweaveとPyLitの2点を候補とした.
ここでは、その2つのツールの主な特徴・prosconsを取り上げ全体的な使用感を比較してみたい.
自分の事情では、PyLitの方が使いやすい という結論が出た.
理由は以下に記すが、簡単に言うと、使用環境/言語を選ばない という至ってシンプルな理由だ.

[python] 文芸的プログラミングのためのツール?

2010-10-08 by ebon | Lavel: 0 comment

コードとコード解説(解説といっても大したものではない.)文書の管理方法を模索している.
対象言語はpythonであり、特にpython用として, コードと文書管理のためのツールで何かいいものはないかというところだ.

そんな中探していると,「文芸的プログラミング」をコンセプトにしたプロジェクトをいくつか発見した.
それらツールをピックアップしてみる.

先に書いておくと、詳細を比較検討した訳ではないが、
ざっと見てみた中で、特に使いたいと思ったのは「Pweave」,「PyLit」の2つだ.

[python] python2.6で使用可能なpathモジュール

2010-08-15 by ebon | Lavel: 0 comment

気軽にstat情報を走査したり、ディレクトリを走査する乗り物スクリプトのような、
findコマンドライクに扱えるものが欲しいと思い、osモジュールやwalkモジュール関連の情報を漁っていたところ、pathモジュールなるものがあるということを以下から知った.


まさに目的として、上記記事で書かれている通りなので喜んで使おうとしたがリンク切れだった..
少し探してみたが、作者による最終更新は結構前であり、オリジナルは2.4までしか対応してないようだ.( The "path" module )

めげずに探したところ、やはり別の方が2.6対応版をGitに上げていた.

[python] lxmlをインストール: ソースから/Macportから.

2010-08-07 by ebon | Lavel: 0 comment

lxmlライブラリを,[RedHatにソースからインストール ,Mac10.5にMacportでインストール]した際のメモ.

そこそこ大きなXMLファイルをパースしたり編集したりしたかったので、
柔軟性と高速なパフォーマンスを備えるlxmlを使用することにした.

基本、以下を参考にさせていただき、はまることなくインストールできた.


自分の場合は、予想に反して特にエラーもなくできたが、
何らかエラーが発生する場合、(そしてエラーは頻発する模様だ)上記記事のコメント欄等含めて参考になるかもしれない.

以下手順でインストール.

[python] (比較的)安全にファイル内の文字列を(その場で)置換する

2010-08-03 by ebon | Lavel: 0 comment

ファイル内の文字列を(その場で)置換したいことは良くある.
単純にファイルを読み込み置換するだけですむなら良いが、やはりできるだけ安全に行いたい.

perlではよく適当に -i オプションを付けて済ませてしまっていたが、
それはどうやら常軌を逸した行いのようだ.
なので少しは誠意ある振る舞いが出来るよう、
(比較的)安全にファイル内の文字列を置換する方法を考え、コードを残しておく.

ほんとに最低限の事だと思うが、安全さを以下のポイントを抑える事で担保する.

ポイント:

  • 一時ファイルに書きだし、それをコピーすることで(その場での)書き込みを行う
  • try ~ finally で元ファイルのcloseは確実に行う

これらをまとめ、以下のコード のように置換を行う関数化しておく.

# -*- coding: utf-8  -*-

import os,re,sys
import tempfile
import shutil

def pat_replace(stext,rtext,file):
    """
    porpose : ファイル内の文字列を(その場で)置換する 
    usage   : pat_replace("置換前パターン","置換後文字列",'target-file') --> replaced file
              * stext は reパターンで渡す必要がある.
    """    
    tmpfd,tmpname = tempfile.mkstemp(dir='.')
    try:
        output_file   = os.fdopen(tmpfd, 'w')
        input_file = open(file)
    except IOError:
        print '"%s" cannot be opened.' % file
    else:
        for line in input_file:
            a = stext.sub(rtext, line)
            output_file.write(a)
    finally:
        output_file.close()
        input_file.close()

    shutil.copyfile(tmpname,file)
    os.remove(tmpname)

[python]「各条件を満たす最初の要素」★以外★を抽出する方法

2010-07-24 by ebon | Lavel: 0 comment

とあるものを書いていて、

"各条件を満たす最初の要素"★以外★を抽出する

という要件が出てきた.

分解し、各動作の組み合わせで、すぐ解決できそうなものではある.
が、その過程でけっこう頭を悩ましてしまったので、解決方針の考えをまとめておく.
思ったより悩んだ要因として、以下の事がある.

  • 条件は複数ある
  • 最初の要素★以外★を抽出したい の以外の部分

これらの解決法としてどう表現するか?を試行錯誤したログのような記事だと思っていただきたい.

やはり例がないと何がしたいのかも分からないので、簡単な例を用意する.
前段階として考えていくに辺り、★以外★の部分もひとまず邪魔だ、
その部分をまず除き、単純化した要件で考えてみる.

"各条件を満たす最初の要素"を抽出する

こちらの動作で考えてみたい.この動作であれば至ってシンプルかと.
例題を用意する.

例題:
リスト:[6,1,5,3,8,10,11]から、
5より小さい要素・8より大きい要素の、それぞれ条件を満たす最初の要素を取り出せ  

つまり期待する動作としては、以下の動作だ.

f [6,1,5,3,8,10,11] -> [1,10] (3,11は対象にならない)
まずすぐに思いつく方法として、以下のfilterなどでもよくあるやり方がある.

  • 条件を満たす最初の要素をリストから抽出する関数、find()関数を用意する
  • 各条件のリスト([p1,p2,...])を用意する
  • 探索対象のリスト(L)を引数としたfind関数へ、各条件を順次適用する

[python] リストから条件を満たす最初の要素を抽出する関数

2010-07-19 by ebon | Lavel: 0 comment

pythonを書いていたら、おもむろに、以下の動作をする関数が欲しくなった.
" リストから、条件を満たす最初の要素を抽出する "
haskellでいうところの,find()にあたる関数というとイメージしやすいだろうか.

単に、" 一致する最初の要素を抽出する " という要件であれば、.index()メソッドがある.
しかし、求めているものは、完全一致する要素の抽出ではなく、
条件を与え、それを満たす最初の要素を抽出する関数だ.

条件を与えるという点で、" filter的な振る舞いをしつつ、それの真になる最初の要素 "
というイメージになるかな.

buludinメソッドの中に特になさそうだったので、高階関数関連のモジュール,itertoolsを調べてみた.

takewhile():predicateが真である限りiterableから要素を返すイテレータ
dropwhile():predicateが真である限りは要素を無視し、その後は全ての要素を返すイテレータ

というhaskellおなじみの関数はあったが、find()に対応する関数はないようだ.

# 調べ不足でどこかにあるのかもしれない..ただ、それはそれで、後に見つけたときに、
自分のアプローチのダメな点が分かりやすくなるだろうから良しとしたい..

ということで、haskellでいうfind()にあたる関数をpythonで書いてみる.
まず参考に、動かしながら挙動を確認してみようと思い、
takewhileをそのままコピペしたら、

AttributeError: 'list' object has no attribute 'next'

というエラーが出てしまった..そもそも for の中でnext()は呼ばれているはずなので、
ここで,.next()を呼んでいる理由が分からない.
ひとまず流して、、dropwhileの方を参考にする.

[python] テーブルデータを扱う方法を考える

2010-07-12 by ebon | Lavel: 0 comment

unixやlinuxで作業していると、あるコマンドで得た、テーブルデータ式の出力結果を、
管理する良い方法がないか考えるシーンがたまにだが、ある.
e.g) df や mount の出力結果を管理したい時 etc..

pythonの学習を兼ねて、テーブルデータ形式の出力結果を扱う方法を考えてみる.
簡単な例を元に考える.
ファイルや、標準出力で何らか以下のようなデーブルデータ形式のデータを得たとする.

X Y Z
a 1 2
b 3 4
c 5 6

多次元リストにして扱う という方法が通常の?やり方だと思う.
その場合、リストに対して該当列を行番号で指定する方法か、awkのように行ごと処理する
というように、欲しいデータが得られるがやり方がやや気に入らない.
やはりここは、行×列 という形式で各項目を指定することで値を得るようにしたい.

そこで,このテーブル形式のデータについて、

hogehogeのfuga

というより自然な形でアクセスできるようにしたい.


そのためには、 多次元連想配列にしておくと良さそう.
# pythonでは連想配列はディクショナリという.(ハッシュの方が呼びやすいな..辞書と呼ぶものなんだか..)

pythonによる関数型プログラミング:参考情報

2010-06-28 by ebon | Lavel: 0 comment

解説系


Functional Programming HOWTO

魅力的なPython: Pythonでの関数プログラミング
2回,3回まである.

Functional programming with Python
map,filter,reduce,等基本的なfunctionalスタイル関数の解説.

Higher Order Perl (Python Style) TOC
あのperlの評価の高いHOPをpythonで。awesome!。。

perl版については、見た目は荘厳なものの、以外と、
・問題が身近・実用的で読みやすい
・sample codeが段階的に肉付けしていっているため,読みやすいいじりやすい
という点がある。
ろくに書けない状態で読みはじめた私でも、読み進めることができた.
(もちろん、全て読んだわけでなく,章によっては現状理解できない。
内容を消化出来てる訳では全くない・・)
でも楽しんで読めるだけでも嬉しい。
それのpython版!!

module系


itertools — 効率的なループ実行のためのイテレータ生成関数
functools — 高階関数と呼び出し可能オブジェクトの操作
標準module.

functional
functional : foldl, foldr, flipなど関数型プログラミングで主要な関数を集めたモジュール
haskell でいうprereudにあたる関数群のモジュールのよう.
C + python で書かれているものと pure python で書かれているものがある.
module:functool, にない関数がカバーされている?
このpureの方をreadingすれば、関数型pythonの基本が身につくかも.

読み物系


Lisp プログラマのための Python 入門

LispとPythonのビミョーな関係
Paul Graham氏が絡んでいるpython関連のエッセイがまとめられている.

Pythonの"関数型"の機能の起源

pythonによるシステム管理:参考情報

2010-06-23 by ebon | Lavel: 0 comment

perlを置き換えたい ≒ pythonでシステム管理 / 書き捨てプログラム
という状況に近い. なので、システム管理周りの情報をひとまず収集.

本当はミニマルPythonがあるといいんだけどな・・(Perl版
という程度がひとまずの自分のニーズ.ごく小さなスクリプトを書く目的.

何事も小さな事からということで、以下を参考にしつつ書き出していきたい.

Python for Bash scripters
これは shellscript or perl scrip
t を置き変えたい人に取っては直球ど真ん中!?

Pythonメモ
scripting時に必要になりそうな最低限の情報がシンプルにまとまってる.
書き始め時に参考にしたい.

システム管理者のための Python
こういう情報が英語圏ではかなり充実しているのか

python in system administration
スライド資料.なぜにchinaの表紙絵??w
情報量は少ない.
vs C, vs bash, vs python のメリットデメリットがあって少しおもしろい.

Python One-Liner of the Month
one liner については不安がある.
perlの一行野郎に比べると、どうしても記述の容易さの面で劣るという先入観がある.
実際どうなんでしょう. 例集が多いと今後
助かるんですが..
ruby,pythonの一行野郎の情報をあまり見たことないな・・・

PerlユーザのためのPython移行ガイド
まさにPerlを置き換えるという内容.どんぴしゃの内容なのか?パラパラ読んでみたい.

python触り始め

by ebon | Lavel: 0 comment

pythonを始めることにした.
使用目的は、日常業務scriptingがメインで,他いろいろ.
直近で言えば,perlの置き換えが目的.

なぜperlを置き換えるかと言うと、以下のような雑多な理由である.

  •     違う言語を触りたい
  •     perlでダラダラ書いていて,堅牢性(ロバストネス?)の点から不安を覚えた
  •     docment, あるいはcode と document を同時に作成するツール・文化が充実している; perlよりもrubyよりも.

正直言って、ちょっとしたスクリプティングの他候補になる言語、
perl,ruby,gauche と比較した時、pythonについてはコンセプト的に最も惹かれない.

gaucheとの比較について
ほんとうは gauche,scsh sheme系で置き換えたかった.
でもスキル不足やメンテナンス性のことを考えると現実的に厳しい...

rubyとの比較について
”pythonの方が関数型思考によりフィットする”
という風説に影響され、pythonをとった.

pythonを始めるにあたってのサイト集

2010-06-14 by ebon | Lavel: 0 comment

つい情報収集にはまってしまう癖があるので、
始め段階ではまっておく.
主に、python初級~中級くらいに参考にしたいサイトのまとめ.

入門の入門


Pythonを始めよう。
python入門まとめサイト
この辺りを参考にさせてもらえば大体、事足りそう。。

python早めぐり
あの、もうひとつのscheme入門を書いている方のpython記事.
schemeが非常に分かりやすかったので!,こちらも期待です.

インスタントPython

おもむろに始めようと思ったとき、これらの情報はとても有難いです。

pythonを始めるにあたってのインストールメモ

2010-06-13 by ebon | Lavel: 0 comment

pythonを始めるにあたってのインストールメモと問題をログ.


とりあえずpython-modeがあれば満足する.
emacserとしては、
・emacs + バッファ読み込み・実行
という基本所作ができれば、最低限気持ちよくコーディングできる.

python/python-mode は、Mac (corbon emacs)だとdefaultだった.
ということで、少し進めて、IDE的な環境の実現を目指す.


ここらあたりの記事を、横断的に参考にさせていただいてなんとかsetup開始

Setup Perfect Python Environment In Emacs

python in Emacs環境

pymacs