特殊フォルダのパスを得る
WScript.ShellオブジェクトではSpecialFoldersプロパティを得ることができる。
このプロパティはwindowsの特別なフォルダ(デスクトップやマイドキュメントなど)のパスを得ることができる。
>>> import win32com.client >>> com = win32com.client.Dispatch("WScript.Shell") >>> com.SpecialFolders("MyDocuments") #マイドキュメントのパスを取得 u'C:\\My Documents' >>> com.SpecialFolders("Favorites") #「お気に入り」フォルダのパスを取得 u'C:\\WINDOWS\\Favorites' >>> com.SpecialFolders("Recent") #「最近使ったファイル」のパスを取得 u'C:\\WINDOWS\\Recent'
windowsの使い捨てスクリプトを書くときに非常に便利。
参考:1.特殊フォルダの取得 ――SpecialFoldersプロパティ――
http://www.atmarkit.co.jp/fwin2k/operation/wsh06/wsh06_01.html
windows COMオブジェクトを操作する
win32allモジュールの中のwin32com.clientは、windowsのCOM(Component Object Model)オブジェクトを操作する拡張モジュール。
Python Win32 Extensions(win32all)
http://starship.python.net/crew/mhammond/win32/Downloads.html
コレを使うことでWSHのように、オートメーション機能を持ったCOMオブジェクトをPythonスクリプトから制御することができる。
IEやExcelの作業を自動化するスクリプトなんかを書くときに便利。
(当然のことながらwin32comはwindows依存。)
>>> import win32com.client >>> com = win32com.client.Dispatch("WScript.Shell") >>> com.Run("notepad.exe") #ノートパッド(メモ帳)の起動 0参考:第5回 WshShellオブジェクトの詳細(1) http://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_01.html
日本語で正規表現を使う
Shift-jisでは値にバックスラッシュ(=0x5c)が含まれる場合がある。(例えば"表"の字)
Pythonではバックスラッシュはエスケープ文字として扱われるので、そのような文字が正規表現のパターンに含まれていると意図しない結果となる。
文字列をいったんunicodeに変換することで、この問題を回避できる。
▼例1
>>> ================================ RESTART ================================ >>> import re >>> string = "表示できますか" >>> print re.sub('表示', "お願い", string) 表示できますか #ちゃんと変換されない >>> patten = "表示" >>> print re.sub(patten.decode("shift-jis"), "お願い",string.decode("shift-jis")) お願いできますか #ちゃんと変換されている
▼例2(yahooから取得したソースを正規表現でサーチする。)
環境:Yahooのページはeuc-jp、Python Shellはshift-jis
対象となる文字データ(ここでは変数html)の文字コードが解っている事を前提。
>>> ================================ RESTART ================================ >>> import urllib2 >>> urlhandler = urllib2.urlopen("http://www.yahoo.co.jp/") >>> html = urlhandler.read() >>> import re >>> pattern = "免責事項" >>> print re.search(pattern.decode("shift-jis"), html.decode("euc_jp")).group() 免責事項
参考:日本語環境でのPython (for Python 2.3 or later)
http://www.python.jp/Zope/articles/japanese/Python4Japanese-2
リンク先では、unicode関数を使っているのだけれど、個人的には文字列のメソッドに統一した方が美しい気がする。
(まぁ、気分の問題)
>>> ================================ RESTART ================================ >>> string = "表示できますか" >>> unicode(string, "shift-jis") u'\u8868\u793a\u3067\u304d\u307e\u3059\u304b' >>> string.encode("shift-jis") '表示できますか'
>>> ================================ RESTART ================================ >>> string = "表示できますか" >>> string.decode("shift-jis") u'\u8868\u793a\u3067\u304d\u307e\u3059\u304b' >>> string.encode("shift-jis") '表示できますか'
参考:2.3.6.1 文字列メソッド
http://www.python.jp/doc/release/lib/string-methods.html#l2h-175
TCPWatchを使って、リクエストの中身を確認しながらテスト
http://hathawaymix.org/Software/TCPWatch
コマンドラインからTCPWatchを起動する。
c:>tcpwatch.py -p 127.0.0.1:3128
TCPWatchをset_proxyしてリクエストを飛ばす
>>>import urllib2 >>>req = urllib2.Request("http://www.google.co.jp") >>>req.set_proxy("127.0.0.1:3128", "http") >>>req.add_header("User-agent", "python") >>>req.add_header("Pragma", "no-cache") >>>site = urllib2.urlopen(req)