PythonとODBC

お久しぶりです。こんにちは。
それでは、PythonからSQLServerに接続し、SELECT文で発行した
データを取得し、タブ区切りで出力するコードを紹介します。

まず、ODBCモジュールのインストールが必要になります。
下記ページから取得可能です。
http://code.google.com/p/pyodbc/downloads/list


では、実際のコード。
※接続文字列はWindows認証です。

                                                                                                                                    • -

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

def main():
## 接続文字列とSQL
servername = "***"
databasename = "***"
sql = u"select top 1000 * from ***"

## SQLServer接続
consql = pyodbc.connect("DRIVER={SQL Server};SERVER=" + servername + ";DATABASE=" + databasename + ";Trusted_Connection=yes;")
cursor = consql.cursor()
cursor.execute(sql)

## 新規出力モードでファイルオープン(カレントに作成)
f = open("test.txt", "w")

for row in cursor.fetchall():
writestring = ""
for x in row:
writestring = writestring + "\t" + str(x) + ""

f.writelines(writestring[1:])
f.write("\n")

f.close()
consql.close()

print u"完了した"


if __name__ == '__main__':
main()

                                                                                                                                    • -


これで動きました。
「***」となっている部分はご利用の環境に合わせて
変わるかと思います。ご利用のSQLSeverがExpressEditionの場合、
servernameはインスタンス名(デフォルトでは、
localhost\SQLEXPRESS」)でいいと思います。

PyScripterでテーブル名などで日本語を利用する場合、
ツールバーの「編集」⇒「ファイルフォーマット」で「UTF-8」を
選択し、文字列を利用する場合、「u""」として下さい。
そうしないと文字化けしました。

SQLを書き込む部分が私のような未熟者らしく、汚らしいコードに
なっているので、より効率のよい方法を模索せねば。

Pythonと変数(リスト)

Python独自の型であるリストについての説明になります。VBAでいうと、配列のようなものです。特徴を紹介していきます。

1.角カッコ内のカンマ区切りの要素を持つ。

                                          • -

a = [0,1,2]

                                          • -

⇒変数aは、0,1,2という3つの要素を持つリストということになります。


2.要素の型は自由。

                                          • -

b = [0,"1","俺,Python"]

                                          • -

VBAの配列は、変数のオブジェクトの型によって入れれる型が決まりますが、Pythonでは数値や文字列が混在していても問題ありません。


3.要素の取り出し(インデクシング)が出来る。

                                          • -

print b[1]

                                          • -

⇒1と表示されます。bの1番目の要素を取り出しています。気をつけて頂きたいのは、特に指定のない限り、配列の一番左の要素は「0番目」という扱いになります。なので、1番目の要素というのは、左から二番目の要素になります。これをインデクシングと呼びます。


4.複数要素の取り出し(スライシング)が出来る。

                                          • -

print b[0:1]

                                          • -

⇒0,1と表示されます。0番目から1番目の要素を取り出しています。これをスライシングと呼びます。


5.要素の追加が可能。

                                          • -

b.append["君,Python?"]
print b[2:3]

                                          • -

⇒俺,Python、君,Python? と表示されます。要素を追加した場合、必ず一番後ろに追加されます。


6.ネストが可能。

                                          • -

c = ["俺",["君","Python"]]

                                          • -

⇒c[1]の要素がリストになっています。リストの中のリストにアクセスする場合、c[1][0]としてあげると、要素「君」をインデクシングしています。


7.要素の削除・変更が可能。

                                          • -

d = [0,1,2,3]
d[0] = 46
del d[1]
print c

                                          • -

⇒46,2,3と表示されます。2行目でdの一番目の要素が0から46に変更され、3行目で二番目の要素が削除されています。


ざっくりと上記のような特徴があります。

Pythonと変数(数値)

前回は文字列を例にとって変数を利用する場合の注意点を記載しましたが、今回は数値のお話です。

                                          • -

a = 1
print a

                                          • -

これを実行すれば当然1と表示されます。これをちょっと応用して変数同士の計算をさせることも出来ます。Pythonでは四則演算が利用可能ですが、少し変わったところもあります。

                                          • -

a = 1
b = 2
print a + b
print a - b
print a * b
print a / b

                                          • -

順に、3, -1, 2, 0と結果が返ります。「最後の結果おかしくない?」という方がいると思いますが、Pythonの仕様では、整数同士の演算では、小数点以下の結果は切り捨てられてしまうのです。これを回避するためには、

                                          • -

a = 1.0
b = 2
print a / b
a = 1
b = 2.0
print a / b

                                          • -

と記述すると結果はどちらも0.5になります。Pythonの演算結果は、計算に利用したオブジェクトの型が複雑な方の型に合わせられます。どちらかが少数点以下を表示する型であれば、演算結果も小数点以下の結果を返してくれます。

Pythonと変数(文字列)

前回の日記でHello,Worldの表示方法を書いた訳ですが、今回はそれに変数を交えてやってみます。

                                          • -

a = "Hello,World"
print a

                                          • -

これでいいのですが、他のプログラム言語との違いをつらつらあげて見ます。

1.変数宣言はないの?
⇒いきなりaに値を代入していますね。例えばVBAだと「Dim a as string」というように、「aは文字列型の変数ですよ。」と宣言してあげる必要があります。しかし、Pythonは変数宣言をしなくても代入した時点で変数とみなされるので問題ありません。

2.変数aの型を指定しないの?
VB等では変数は上記の1のように型まで指定してあげる必要がありますが、Pythonではその必要がありません。というのは、変数aに"Hello,World"という値を代入している訳ではないからです。aはあくまでメモリ上に展開され"Hello,World"というオブジェクトを参照しているだけなのです。なので、aに数字を代入(メモリ上の参照先を変更しているだけです)することも可能です。


2を証明するため、ひとつ例を挙げてみましょう。

                                          • -

a = "Hello,World"
b = a
b = "ORE,DJYOSUKE!"
print a

                                          • -

上記の結果は何と表示されると思いますか?
正解は「Hello,World」です。2行目で変数bは変数aと同じ"Hello,World"というオブジェクトを参照しています。3行目でbは"ORE,DJYOSUKE!"というメモリ上の値に参照先を変更しています。ここでaのオブジェクトの参照先には変化がないのです。この辺りはプログラムを書く際に注意したいところです。

こんにちは、Python

Pythonもインストールしたし、開発環境のPyscripterも用意したところで、プログラマお馴染みのあれを表示してみましょう。下記の手順を実行してください。

1.Pyscripterを起動。
2.「print "Hello,World!"」と入力。
3.Ctrl+F9を押して実行。(ツールバーにも実行ボタンあります)

上手く表示されましたね?ところで「print "Hello,World!"」は「print 'Hello,World!'」と書いても同じ結果が得られます。Pythonでは、シングルクォーテーションで囲んだ部分もダブルクォーテーションもで囲んだ部分も文字列として扱われ、違いはありません。

Python開発環境

Pythonテキストエディタでも記述が出来ますが、開発環境を用意した方が効率がいいです。というわけで、統合開発環境をインストールしましょう。

PyScripterというソフトを下記から入手しましょう。
http://mmm-experts.com/Downloads.aspx?ProductId=4


これはとても便利です。実際にコーディングする際の補助機能が多数用意されています。例えば、インテリセンスやデバッグ機能、記述がおかしい部分は破線表示になる等、プログラムを書く際に役に立つ機能が満載です。

Python標準のIDEコマンドプロンプトからもPythonスクリプトの実行は可能ですが、総合的に考えるとPyscripterをインストールするのが無難かと思います。

インストールPython

Pythonをインストールする方法について。

まず、下記ページからOSにあったインストーラをダウンロードしましょう。
http://www.python.jp/Zope/download/pythoncore
※自分はバージョン2.5系を入れてあります。

ダウンロードしたファイルを実行して指示に従って進めていけば、大丈夫です。

注意するのは、バージョンです。大きく分けて2.X系と3.X系がありますが、
仕様が違う部分がかなりあります。徐々にシフトしていくとは思いますが、
現行は2.X系の方が主流ですので、こちらをインストールする方が無難だと
思います。