ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

python

プログラムテスト用の組み合わせパターンデータをササッと作るためのテンプレ【Python/Clojure】

他の誰かが作成した検索プログラムやストアドファンクションを 修正させられる時に、 検索対象のテストデータとか プログラムに渡す検索パラメータのテスト用データを 必要なパターン分作成してテストするのだけど、 抜け漏れのないテストデータを簡単に生成…

はてなカウンターのログを分析できるようにデータベースに取り込むスクリプト【Python/Clojure】

はてなカウンターの「ログ」画面で ログを月単位でダウンロードできることを発見したので、 ダウンロードしたログを分析用にデータベースに保存するスクリプトを作成する。

Pythonのジェネレータを使って大容量ファイルを分割する

過去に下記のような、ファイルを複数に分割する方法について記事を書いた: blog.honjala.net この記事に書いたコードをもう少しエレガントに書けないものか、 と方法を調べていて、 Pythonのジェネレータが使えそうだったので色々試してみた。

PythonでSSHトンネリングしてデータベースアクセス

稼働中のWebアプリのデータベースに定期的にアクセスして データの状態をチェックしたい、でもデータベースには 外部から直アクセスできないようになっているので、 SSHトンネル経由でないとアクセスできない、という場合。 A5:SQLなりpgAdminなり最近のDBア…

Pythonでgrep風にディレクトリ内のファイルを検索する方法(Python3対応&機能追加版)

だいぶ前に書いた下記の記事 blog.honjala.net の内容がPython3で動かないようなので、 Python3対応しつつ、もう少し使えるように書きなおしてみる。

SQL Serverから出力したrptファイルを使いやすいようにcsvファイルに変換する【Python】

SQL Serverからエクスポートしたrpt形式ファイルを渡され、 CSVに変換してくれと依頼される。 「あれ、SQL Server Management Studioに 直接CSV出力する機能ありませんでしたっけ?」 と確認しても「しらん。やれ。」と言われる。 そんなよくある状況で助け…

ボケてきたのかタイムカードの打刻を忘れてしまうので、打刻漏れ防止用チェックプログラムを作成した

毎朝出社時に社員カードで入室し、 入室したのと同じカードで出勤打刻をするのだが、 入って数歩のところにタイムレコーダーが置いてあるにも関わらず、 打刻が漏れることがある。 どうやら、 雨の日に途中で傘を置いたり(傘立てはドアとタイムレコーダーの…

PostgreSQLにサクッとテストデータを登録するPythonテンプレ

Python手軽でいいね、ってことで 最近はJavascriptよりもPythonでスクリプトを書いている。 今日もパフォーマンステスト用に大量データを登録する必要があったので SQLAlchemyを使ってスクリプトを書いてみた。 Python3で動作確認済み。

iPythonでコマンド履歴ログ出力を自動化する

たまにはPythonを使っておこう、 ということでここ数日シェル環境としてiPythonを使っている。 Jupyter and the future of IPython — IPython ほぼPython言語としての機能は使っていないのだけど、 ちょっとした計算をしたりするにはなかなか便利だ。 せっか…

Pythonでオブジェクトから階層ごとに属性があるかチェックせずに値を取得するための関数

AmazonのAPIを触っていて、レスポンスとして返ってきた(XMLから生成された)オブジェクトから値を取得する際にいちいちhasattrでチェックするのが面倒だったので、そのパスがなければデフォルト値を返す関数を作った。 見つけられなかったけど、標準ライブ…

PythonでExcelの表からINSERT用SQLを生成して初期データ作成を楽にする

職場はメイン言語がJavaなので、プロジェクトでPythonを使う機会は ないのですが、キャプチャを撮ったりExcelを操作したりする作業を 「こっそり自動化」するスクリプトをPythonで書いたりしています。 最近はSE作業で何かとExcelを使うことが多いので、 Exc…

Python+ScrapyでWeb上のリストからデータを抽出する

昨日の続きでScrapyをさわる。 ちなみに、昨日Linux環境にインストールする時は苦労したが、 今日Windows環境にpipでScrapyをインストールしてみたら、 何ひとつひっかからずにインストールが完了した。 ともあれ、ようやくScrapyをインストールできたので、…

CentOSのPython2.7環境にScrapyをインストールするまで

ひとつPythonでWebスクレイピングでもやってみようかとScrapyをVPS環境に入れてみたところ、インストールするだけで手間取ってしまった。 環境はPython2.7.3で、インストールしてから特に何も設定していない状態。 本サイトに書いてある通り、まずは pip ins…

PythonとPandasで作業履歴から案件別作業別のピボットテーブルを作成する

作業履歴が入ったデータベーステーブルから、 案件情報を行に、作業内容(「設計」とか「PG」とか)を列に、 案件別作業内容別合計時間を値として持つピボットテーブルを作成して Excelで確認する必要があったので、以前から興味のあったPandasを 使ってスク…

指定したフォルダ内のファイルのファイル名から特定のパターンの文字列を一括削除する

フォルダを指定してその中のファイルのファイル名の一部を削除するちょっとしたスクリプト。子フォルダの再帰処理はしない。 001_(hoge).txt、002_(fuga).txtなどのファイルを001_hoge.txt、002_fuga.txtに一括変換したい時なんかに使えるよう、正規表現でパ…

Pocketからエクスポートしたブックマークをデータベースに取込むスクリプト

自分のブックマークを色々分析できるように、PocketのOptionsページから エクスポートしたブックマークのリストをデータベースに取込む。 PythonでMySQLdbとBeautifulSoup4を使用。 テーブル CREATE TABLE bookmarks ( id integer NOT NULL AUTO_INCREMENT, …

Apacheのログからアクセス数上位20件のIPアドレスを表示する

こちらを参考にしました http://www.freia.jp/taka/blog/356 import re f = open("error_log") pattern = re.compile(r"\[client (?P<ip>[0-9\.]+)\]") ips = {} for line in f: m = pattern.search(line) if m: ip = m.group("ip") ips[ip] = ips.get(ip, 0) + </ip>…

Foursquare API のOAuth認証用クラス

FoursquareのAPIを使って場所系のサービスでも作ってやろう、 と思い立って作っている。 APIドキュメントのRate Limitingを読んだところ、 認証済みの場合は認証ユーザー毎、認証していない場合はIPアドレス毎に 1メソッドにつき1時間200アクセスまでと制限…

re.finditerで正規表現マッチしたパターン毎にグループ化

分かりにくいタイトルだけど。 1つのファイル内に同じパターンにマッチする箇所が複数ある場合に、 個々の箇所でデータを名前つきグループ化して抽出したい場合に使える。 例えば、HTMLファイルの中からテーブルの各行から個々の列の値を取り出す時とか。 パ…

関数の呼び出しログを取る

デコレータ便利。この例では呼び出しと引数だけをログしてるけど、 処理にかかった時間の計測とか、色々できそう。 log.py import logging def log_api_call(func): def decorator(*args, **kwargs): logging.info("API: %s called. params: %s %s" % (func.…

lxmlでHTMLページタイトル取得

一応動くサンプル。あんまりテストしてないので、取得できないパターンはあるかも。 覚えておきたいのはxpathの設定方法で、 どうやら //head/title/text() と書くとたまにうまくタイトルが取得できない場合があるようで、 そんな場合でも //title/text() と…

正規表現で引用符を検索する

TumblrのRSS解析を試みていて、そこでQuote登録した文字列を検索して変換しようとしたところ、苦労したのでメモ。 RSSのソースを見たところ、引用した部分は二重引用符で囲まれているようだったので、普通にダブルクオートで検索してみたけどうまくヒットし…

tinyurlやbitlyのURLから元のURLを取得する

各サービスのAPIでも取得できるようだけど、一応こんな方法でもできた、ということで。 import urllib2 def get_real_url(url): r = None try: r = urllib2.urlopen(url) except: pass if r: url = r.geturl() return url long_url = get_real_url("短縮URL"…

python-bitlyとpython-twitterを使ってTwitterにポストする

Honjalaに新規登録されたブックマークをTwitterに自動投稿するスクリプトを書いた。 ブログやブックマークをTwitterに自動投稿する機会は今後もありそうなのでメモ。 準備 Twitterとbitlyにアカウントをあらかじめ作成しておく。 PythonからTwitter APIを利…

三項演算子の使い方

毎回忘れて探し回るので、ここに書いておく value = then_value if predicate else else_value こちらより http://www.shido.info/py/python10.html

指定ディレクトリの内容を再帰的に削除

また使いそうなので記録。指定ディレクトリ内の.svnやらCVSやらを一括削除するためのスクリプト。 バグがあるかもしれないので、削除処理をコメントにして削除対象を確認できるようにしておく。 recursive_delete.py # -*- coding: utf-8 -*- import os impo…

lxmlで日本語のWebページのタイトルを取得する

日本語が化けて大変苦労したのでメモ。 結論として、XML(またはHTML)を解析する前にunicode関数に通しておく、 ということで良いのかな? 相変わらず文字コード関連はよく分からない。 from urllib import urlopen from lxml import etree html = urlopen(…

置換処理の置換後の文字列の代わりに関数を指定する

今後も使えそうなのでメモ。 import re from django.core.exceptions import ObjectDoesNotExist from sample.web.models import WebPage PATTERN = r'<a href="%(dummy_url)s" >%(real_url)s</a>' HTML_TEMPLATE = re.compile(r"((http|https)://[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)"…

Pythonでコマンドプロンプトを拡張

WindowsのコマンドプロンプトをPythonで拡張するwxPythonアプリケーションを作った。 Linuxシェルでも動くかもしれないが、試していない。 pythonスクリプトと、シェルコマンドが使える。コマンドを入力すると、 最初に指定ディレクトリ内のpythonスクリプト…

Pythonで大容量ファイルを指定行数で複数ファイルに分割する

これもちょっと必要だったので作成したスクリプト。 秀丸やgVimで開けないほど大きいファイルを分割する。 split_file.py # -*- coding: utf-8 -*- in_file_name = "verybigfile.log" out_file_name_template = "splitted_%d.log" max_lines = 1000000 split…

Pythonでgrep風にディレクトリ内のファイルを検索

大した機能ではないが、せっかくスクリプトを作ったので保存しておく。 せめて検索フォルダと検索文字列はコマンドオプションとして 渡せるようにしておくべきだったか。 pygrep.py import os import re search_dir = "<検索対象フォルダパス>" search_pat…

CentOSにJPEGサポート付きでPIL(Python Imaging Library)をインストールする

思いのほか苦労したのでメモ。 CentOSにPython2.5とPIL1.1.6の環境を作成してプログラムを動かしてみたところ、 JPEG画像の処理に失敗し、下記のログが表示された。 decoder jpeg not available なんやかんやで下記のライブラリが必要だと分かったのでインス…

Pymacsを使ってPythonでEmacs拡張

NTEmacsを使い始めたので、Pymacsを入れて簡単なプラグインを作ってみた。 EmacsはVimと比べるとまだまだ不満がいっぱいだが、色々プラグインを 作ってVimの快適さに近づけていきたい。 苦労したのでメモ。 Pymacsのインストール Python2.5環境で試した。 あ…

UnicodeDecodeErrorが発生する文字をignoreオプションで無視する

Pythonで文字コードを変更する際に変換対象の文字列に変換不能な文字が 含まれているとUnicodeDecodeErrorが発生して困ることが多かった。 しかし、unicode関数やencode関数のignoreオプションを使うと、 それらの変換不能な文字列を無視して変換してくれる…

Pythonで1行メモVimスクリプト

先日に引き続きPythonでVimに挑戦。 コマンドラインで書き込んだメモをファイルに蓄積していくVimプラグインを書いてみた。 画面に表示している内容とまったく関係ないふとした思いつきを書き込む。 :PyMemoAdd メモ のような感じで使う。 pymemo.vim if has…

BeautifulSoupで特定の属性値を持つタグを取得する

下記のようなXMLから rel="next" なタグの href 属性を取得する場合 <feed version="0.3" xml:lang="ja"> <title>Pirosukeのブックマーク</title> <link rel="alternate" type="text/html" href="http://b.hatena.ne.jp/piro_suke/" /> </link></feed>

PythonでVim用のファイルブックマークプラグインを作る

初めてのVimスクリプトをPythonで書いたが、 ほとんどVimの機能を呼び出しているだけになってしまった... しかし楽しい。 環境は gVim7 + WinXP + Python2.5 + BeautifulSoup。 :PyBookmarkAdd でカレントバッファのファイルをブックマーク。 :PyBookmarkLis…

PythonでVim拡張

同じモノを作り続けると飽きるので、気分転換にVimscriptを書き始めた。 自分のエディタが拡張できるのはかなり楽しい。 ひとまず登録、変更、削除、一覧表示ができるようにファイルブックマークプラグインでも作る。 ん、これはVimscriptを書いているのでは…

SQLObjectで昔作ったデータベースのデータを取り出してCSVファイルに落とす

データベースを移行する作業があったので、PythonのORマッパ、SQLObjectを使ってみた。 ついでにCSVファイルに出力する標準モジュールも使ってみる。 mysqlのコマンドだけでできる作業のような気がしないでもない...。 まあ、pythonでデータを操作できるし嬉…

Pythonで辞書を要素とする配列を特定のキーでソート

探したけど見つからなかった。 初めてのlambda。 ranking_list = [] ranking_list.append({"uriage": 30, "shiire": 5, "zairyo": 20 }) ranking_list.append({"uriage": 20, "shiire": 10, "zairyo": 10 }) ranking_list.append({"uriage": 10, "shiire": 1…

Pythonで数値に3桁毎にカンマを入れる

あちこち探して、結局下のエントリと同じdecimalパッケージの マニュアルにサンプルとして掲載されているのを発見。 ここのmoneyfmt関数。 http://www.m-takagi.org/docs/python/lib/decimal-recipes.html print moneyfmt(Decimal("2000"), 0, dp="") # 2,00…

Pythonで10進数計算したり数値を丸めたりする

指定した桁で切り捨てたり四捨五入したり、 2進数だと丸め誤差が生じる計算を正しく行うための標準ライブラリ。 from decimal import * x = Decimal("2.467") y = Decimal("3.512") # 小数点以下を切捨て print Decimal(x).quantize(Decimal('1.'), rounding…

PythonでReportLabでPDF出力

どうやらPythonのPDF生成はReportLabがスタンダードっぽいので使う。 Unicodeでの縦書きが難しかったのでDjangoで表示する方法メモ。 views.py ... from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.cidfonts import UnicodeCIDFont from r…