Python

Pythonで一時ファイルを使う方法

システムを設計していると、一時的にダミーファイルを作っておき、そのファイルを使って何かの処理をした後で、そのダミーファイルを消したいときがある。

Pythonなら↓のように書くのが簡単だ。


open('dummy.txt', 'w').close()

//何かの処理

os.remove('dummy.jpg')

| | コメント (0) | トラックバック (0)

Pythonでバイト列をUDPで送信する方法

組込み機器をLAN経由でコントロールする場合、バイト列をUDPで送信することがある。

そんなシステムのプロトタイプも、Pythonなら簡単に作ることができる。

例えば、2バイトのデータをUDPでサーバに送信するPythonのコードは次のようなものだ。

import socket
import struct

host = '192.168.0.100'
port = 8000

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.sendto(struct.pack('>H', 0), (host, port))

| | コメント (0) | トラックバック (0)

一番最近更新したファイルを、Pythonで見つける方法

あるディレクトリに含まれるファイルを、更新時刻が新しい順に並べたいときがある。

たとえば、複数のテキストファイル(*.txt)を新しい順に並べる場合だと、次のようなコードを書けば良い。

import os
import glob

[key for key, value in sorted({file:os.path.getmtime(file) for file in glob.glob('*.txt')}.items(), key=lambda x:x[1], reverse=True)]

これで更新時刻が新しい順に並んだファイル名のリストを得ることができる。

一番新しいファイルの名前だけが欲しい場合は、次のように書く。

sorted({file:os.path.getmtime(file) for file in glob.glob('*.txt')}.items(), key=lambda x:x[1], reverse=True)[0][0]








| | コメント (0) | トラックバック (0)

Pythonでエクセルブックにどんなシートがあるのかを調べる

最近めっきり話題になることが少なくなったマイクロソフトだが、会社や学校ではまだまだオフィス製品を使うことが多いだろう。

例えばエクセルだ。

本当によくデータ管理に使われることが多いこのソフトウェアだが、中にどんなデータが入っているのか、ファイルを開いてみないとわからない。

実に面倒だ。

せめて、そのファイルにどんなシートが入っているのか入っているのかが分かれば、それだけでもかなりの手間が省けるのだが。

そこで、エクセルファイルに含まれるシートの名前リストをファイルに書き出すプログラムを、pythonで作ってみた。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import win32com
from win32com.client import *
import codecs

app = win32com.client.Dispatch("Excel.Application")
app.Visible = False

book = app.Workbooks.Open(os.path.join(os.getcwd(), sys.argv[1]))

alist = [x.Name for x in book.Worksheets]

with codecs.open("sheets.txt", "w", "shift_jis") as fout:

  fout.write(book.Name+"\n")
  [fout.write(x + "\n") for x in alist]

| | コメント (0) | トラックバック (0)

Pythonでファイルやディレクトリのリストを作る

ちらかしてしまったディスクの整理を久しぶりにする時、あるディレクトリより下に、どんなディレクトリやファイルがあるのかを調べたくなる。
そんな時にもPythonを使うと、そんなディレクトリやファイルのリストを簡単に作ることが出来る。
例えば、あるディレクトリより下にある全てのファイルのリストを作るなら、次のようなコードを使えば良い(コード1)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
for root, dirs, files in os.walk('.'):
    for file in files:
        print (os.path.join(root, file))

また、あるディレクトリより下にある全てのディレクトリのリストを作るなら、次のようなコードを使えば良い(コード2)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
for root, dirs, files in os.walk('.'):
    print (root)

以上

//

初出時は、以下のように書いていたが、上のコード2がより適切だ。

以下の方法でも結果は同じだが、冗長だ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
for root, dirs, files in os.walk('.'):
    for file in files:
        print (root)

ただ、このコードを実行すると、同じディレクトリが重複して表示されてしまうため、コードの実効結果を次のように加工すれば良いだろう。

getdirs.py | sort | uniq

ここで、getdirs.pyはコード2だ。
なおコード1とコード2はPython3.xで動作する。

| | コメント (0) | トラックバック (0)

テーブルソートを実現するJavaScriptライブラリ

先日、とある情報をリスト表示するWebページを作って、仲間内で公開したところ、早速、リスト表示をソートする機能を付けて欲しいというリクエストを受けた。
そこで、tablesortというJavaScriptのライブラリを使って、さくっと作ってみた。

Webページ自体は、オラクルデータベースのデータを基に、Pythonで自動生成させており、その自動生成プログラムは、あっという間に作れたのだが、今回のソート機能も、ものの30分もかからずに作れた。

世の中便利になったものだ。

★WOZ★

| | コメント (0) | トラックバック (0)

PythonとPySerialでシリアル通信アプリケーションを作れる

Windows7上に作ったシリアル通信のテスト環境で、Pythonによるシリアル通信を試してみた。今回使ったはPySerial2.5とPython2.6だ。

PythonアプリケーションとTeraTermとの間で読み書きできることを確認できた。

以下は、COM20とCOM21を仮想接続した状態で、TeraTermでCOM20に接続し、PythonアプリケーションでCOM21に接続する場合だ。

(1)COM21に接続して"hello"を入力してポートを閉じる

>>> import serial
>>> ser = serial.Serial(20)
>>> print ser.portstr      
>>> ser.write("hello")    
>>> ser.close()            

するとTeraTermに"hello"が表示される。

(2)COM21に接続してTeraTermからの入力を待つ

>>> ser = serial.Serial(21 )
>>> s = ser.read(5)       
>>> ser.close()

TeraTermで"hello"と入力すると、sに"hello"がバインドされる。
----------
PythonとPySerialの組み合わせで、このように非常にお手軽にシリアル通信を実現できる。

ところで、残念ながらPython3.1ではPySerialのimportが失敗するが、64bit-Windows7だけの問題かもしれない。またLinuxで試してみるつもりだ。

★WOZ★

| | コメント (0) | トラックバック (0)

Pythonの辞書

Pythonの辞書はいろいろなところで便利に使える。
例えば、名前から年齢を知る辞書だと、下のように使う。

キー(名前)と値(年齢)の組を取り出すなら、

>>> adict = {'taro':20, 'jiro':15}
>>> for name, age in adict.items():
...         print name, age
...
taro 20
jiro 15

キーを取り出すなら、

>>> for name in adict.keys():
...     print name
...
taro
jiro

あるキーが含まれているかどうかを調べるなら、

>>> 'jiro' in adict
True
>>> 'saburo' in adict
False

キーのリストを作るなら、

>>> adict.keys()
['taro', 'jiro']

★WOZ★

| | コメント (0) | トラックバック (0)

Pythonでエクセルブックとオラクルデータベースを連携させる

Pythonはグルー言語と言われる。

英語で書くと"glue language"だ。

glueとは、にかわ(接着剤)のことで、グルー言語とは、様々なコンポーネントをくっつける言語のことだ。

例えば、Pythonを使うと、エクセルブックとオラクルデータベースをくっつけて、

エクセルブックからデータを読み込んで、オラクルデータベースに登録するアプリケーションや、

逆に、オラクルデータベースに登録されているデータを、エクセルブックに書き出したりするアプリケーションを、

簡単に作り上げることができる。

エクセルブックの読み書きにはwin32comパッケージを、オラクルデータベースの操作にはcx_Oracleパッケージを使うのが良い。

★WOZ★

初めてのPython 第3版 Book 初めてのPython 第3版

著者:Mark Lutz
販売元:オライリージャパン
Amazon.co.jpで詳細を確認する

★WOZ★

| | コメント (0) | トラックバック (0)

PythonのURLデコード

Apacheのアクセスログの一部がURLエンコードされていることがある。
例えば、アクセスログにこんな文字列を見つけたら、それはURLエンコードされた文字列だ。
%e9%89%84%e4%ba%ba28%e5%8f%b7

実はこの文字列は"鉄人28号"をURLエンコードしてある。

Pythonでこの文字列をURLデコードするには、urllibパッケージを使う。
使い方はこうだ。

>>> import urllib
>>> a = '%e9%89%84%e4%ba%ba28%e5%8f%b7'
>>> print a
%e9%89%84%e4%ba%ba28%e5%8f%b7
>>> b = urllib.unquote_plus(a)
>>> b
'\xe9\x89\x84\xe4\xba\xba28\xe5\x8f\xb7'
>>> print b
鉄人28号

Apacheのアクセスログの解析ツールをPythonで作る場合に、この方法が使える。

★WOZ★

| | コメント (0) | トラックバック (0)