メインコンテンツまでスキップ

「File」タグの記事が16件件あります

全てのタグを見る

Python: Microsoft Wordファイル(*.doc)のテキストデータ抽出 - pywin32, win32com

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

Microsoft Office Wordファイルの検索クローラをPythonで作成する際、表題の通り、*.docからテキストデータに変換する必要がある。本記事ではwin32comライブラリを用いてPythonスクリプトからWordファイルのテキストデータを抽出するスクリプトを紹介する。 (尚、世には多数のOfficeファイルコンバーターが有るので、このソースを使うことが最適とは限らない)

Python: Microsoft PowerPointファイル(*.ppt)のテキストデータ抽出 - pywin32, win32com

· 約3分
Yu Sasaki
Enterprise Security Manager / Advisor

Microsoft Office PowerPointファイルの検索クローラをPythonで作成する際、表題の通り、*.pptからテキストデータに変換する必要がある。本記事ではwin32comライブラリを用いてPythonスクリプトからスライド中の各シェイプボックスからテキストデータを抽出するスクリプトを紹介する。 (尚、世には多数のOfficeファイルコンバーターが有るので、このソースを使うことが最適とは限らない)

Android: リソースの画像ファイルの拡大・縮小描画 - drawBitmap()

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

画像ファイルの表示(拡大・縮小)

表示する画像はEclipse上でAndroidプロジェクト作成時に自動的に作成されるIcon画像です。 画像パス:プロジェクト名/res/drawable-hdpi/icon.png resフォルダ以下に置かれたリソースはコンパイル時にプログラムに組み込まれます。その画像リソースを読み込む際は、

Bitmap BitmapFactory.decodeResource(Resources r, int resourcesID)

を用います。読み込んだBitmapインスタンスを描画するには、Canvasクラスのインスタンスメソッドである

void drawBitmap(Bitmap image, int x, int y, Paint p)

を使います。なお、拡大・縮小する場合も上記のdrawBitmapをオーバーロードしたものを使います。

void drawBitmap(Bitmap image, Rect src, Rect dst, Paint p)

今回のサンプルプログラムでは、元画像の幅と高さを2倍したイメージを描画しています。

ImageSp.java

package info.yukun.imagesp;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class ImageSp extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new ImageView(this));
}
}

ImageView.java

package info.yukun.imagesp;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.view.View;
public class ImageView extends View {
private Bitmap image;
public ImageView(Context context) {
super(context);
setBackgroundColor(Color.WHITE);
// リソースの画像ファイルの読み込み
Resources r = context.getResources();
image = BitmapFactory.decodeResource(r, R.drawable.icon);
}
@Override
protected void onDraw(Canvas canvas) {
// イメージ描画
canvas.drawBitmap(image, 0, 0, null);
int w = image.getWidth();
int h = image.getHeight();
// 描画元の矩形イメージ
Rect src = new Rect(0, 0, w, h);
// 描画先の矩形イメージ
Rect dst = new Rect(0, 200, w*2, 200 + h*2);
canvas.drawBitmap(image, src, dst, null);
}
}

Python: ファイル読み込み時の例外の扱い例 - try、except、else、finallyブロック

· 約4分
Yu Sasaki
Enterprise Security Manager / Advisor

ファイルのパスや名前のミス、パーミッションの権限が無い等が原因でファイルを読み込めない場合がある。そのような場合、すなわち例外が発生した際にそこで処理を中断して、発生した例外に合わせた処理ブロックにジャンプする構文が、try:~except Error:~構文。 今回は、コマンドライン引数で英文テキストファイル名を指定し、スクリプト内でファイル内容を読み込み、単語数をカウントし出力するスクリプトを以って、オプションのelse、finallyブロックを含めた例外ブロックの扱いを確認する。 ただし、ここでの「単語」とは、簡単に考える為、1つの空白文字で区切られた文字列とする。

ソースコード

# -*- coding: UTF-8 -*-
import sys
script_name = sys.argv[0]
try:
arg = sys.argv[1]
f = open(arg, 'r')
except IndexError:
print 'Usage: %s TEXTFILE' % script_name
except IOError:
print '"%s" cannot be opened.' % arg
else:
print arg, 'contains', len(f.read().split(' ')), 'words.'
f.close()
finally:
print 'n"%s" process end.' % script_name
quit()
print 'Not reach this line.'

コードの説明

tryブロック

まず、例外を発生させる恐れのある行は、tryブロック内に書く。 ここで発生する可能性がある例外はコマンドライン引数が格納されているリストへのアクセス部分であるsys.argv[1]。[]演算子で存在しない要素を参照する例外。また、ファイルを開くopen(arg, 'r')も冒頭の理由で例外発生の可能性もある。

exceptブロック

exceptブロックは、tryブロックで例外が発生した場合にのみ実行されるブロックです。その為、例外が発生しない場合は実行されない。 発生する可能性のある例外のタイプ毎にexceptブロックを書けば、そのタイプ毎の例外への対処処理を書くことが出来る。

except TYPE_AError:
TYPE_AErrorが発生した際のとある処理...
except TYPE_BError:
TYPE_BErrorが発生した際のとある処理...

elseブロック (オプション)

elseブロックは全てのexceptブロックの後に書く(任意なので書かなくても構わない)。 elseブロックはtryブロックで例外が発生しなかった場合にのみ実行されるブロック。今回は、ファイルの読み込みとクローズに使用している。

finallyブロック (オプション)

finallyブロックはtryブロックで例外が発生するしないに関わらず実行されるブロック(任意なので書かなくても構わない)。

実行結果

読み込むテキストファイルを以下の_aLine.txt_とする。 aLine.txt

Unless I set the standard where I am in any level, I'll be puzzled about what I should do from now on.

コマンドラインで適切な引数を与えた場合

$ python excp01.py aLine.txt
aLine.txt contains 22 words.
"excp01.py" process end.

存在しないファイル名を引数を与えた場合

$ python excp01.py texfile.tex
"texfile.tex" cannot be opened.
"excp01.py" process end.

コマンドライン引数を与えなかった場合

$ python excp01.py
Usage: excp01.py TEXTFILE
"excp01.py" process end.

例外オブジェクト名をpython処理系に聞いてみる

どんなメソッドや関数、演算子が、どのような例外を投げるのか予測が付かない場合もある。そんな場合、一旦はスクリプトを実行してエラーを確認する。 SyntaxError: invalid syntax以外のエラーがある場合、例えば、

$ python excp01.py
Traceback (most recent call last):
File "excp01.py", line 5, in
arg = sys.argv[1]
IndexError: list index out of range

のような場合は、最終行の行頭のIndexErrorが例外名となる。

何でも例外任せにしていいの?

計算量が増える為、良くない。今プログラムのコマンドライン引数の確認を、 if len(sys.argv) != 2: ホニャララ とすると整数の比較ですむが、例外のキャッチに任せると、例外インスタンスを生成し送出という計算量の大きい処理が掛かる。ネットワーク接続やファイル読み書きなどのIOでは例外はイベント駆動で発生する為、例外制御が必須ですが、それ以外では使用しない。

ドキュメント

Rで統計: CSVファイルの読み込み - read.csv()メソッド

· 約3分
Yu Sasaki
Enterprise Security Manager / Advisor

読み込むCSVファイルは2007年度のセリーグの打撃成績の順位です。

参考:2007年度 セントラル・リーグ 個人打撃成績(規定打席以上)

batting2007.csv

順位,打率,安打
1,0.346,193
2,0.343,204
3,0.318,172
4,0.313,177
5,0.31,175
6,0.308,155
7,0.302,122
8,0.302,118
9,0.3,120
10,0.3,139

プロンプト

> read.csv("batting2007.csv")
順位 打率 安打
1 1 0.346 193
2 2 0.343 204
3 3 0.318 172
4 4 0.313 177
5 5 0.310 175
6 6 0.308 155
7 7 0.302 122
8 8 0.302 118
9 9 0.300 120
10 10 0.300 139
> batting$安打
[1] 193 204 172 177 175 155 122 118 120 139

read.csv()メソッドでCSVファイルを読み込み、そのデータフレームをbatting変数に格納しています。

実行結果を見ると、ファイル1行目のフィールド(列)名が変数名を表し、2行目以降がテーブル本体を表していることが分かります。これによって、例えば安打の列を抽出したい場合は、batting$安打と指定すればOKです。

ただ、毎回々々「batting$安打」と指定するのは億劫ですので、以下のコマンドで簡略化します。

> attach(batting)
> 安打
[1] 193 204 172 177 175 155 122 118 120 139
>

attach()関数によってワークスペースにオブジェクトが保存され、データフレーム内の変数名のみでのアクセスが可能になります。

read.csv()メソッドのheader引数にFALSEを指定した場合

read.csv()メソッドはデフォルトでheader引数にTRUEが指定されていますが、以下のようにFALSE(必ず大文字)を指定することも出来ます。その場合の動作は以下のようになります。

> batting <- read.csv("batting2007.csv", header=FALSE)
> batting
V1 V2 V3
1 順位 打率 安打
2 1 0.346 193
3 2 0.343 204
4 3 0.318 172
5 4 0.313 177
6 5 0.31 175
7 6 0.308 155
8 7 0.302 122
9 8 0.302 118
10 9 0.3 120
11 10 0.3 139
> batting$V3
[1] 安打 193 204 172 177 175 155 122 118 120 139
Levels: 118 120 122 139 155 172 175 177 193 204 安打
>

ファイル1行目の列名がテーブル本体のデータセットに組み込まれていることが分かります。この場合の列へのアクセスは上の実行結果から、batting$V3と分かります。フィールド(列)名(一行目)を省略したCSVファイルを読み込みたい場合にはこのオプション引数を指定します。

Python: テキストファイルの行頭に行番号を追加

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

コマンドラインで指定されたテキストファイルの行頭に行番号を追加し、そのデータを新たなファイルに書き出すスクリプトです。

ソースコード

#!/usr/bin/python
# coding: UTF-8
import sys
argvs = sys.argv
argc = len(argvs)
if (argc != 3):
print 'Usage: $ python %s target_file making_file' % argvs[0]
quit()
f = open(argvs[1])
lines2 = f.readlines()
f.close()
nf = open(argvs[2], 'w')
i = 1
for line in lines2:
nf.write('%3d: %s' % (i, line))
i = i + 1
nf.close()

仮にこのソースコードをfile05a.pyというファイルで保存した場合、使用する際はプロンプトに以下のように打ち込みます。

実行結果

プロンプト

> python file05a.py file05a.py file05a-l.txt

この結果、生成されたファイルが下記になります。

file05a-l.txt

1: #!/usr/bin/python
2: # coding: UTF-8
3:
4: import sys
5:
6: argvs = sys.argv
7: argc = len(argvs)
8: if (argc != 3):
9: print 'Usage: $ python %s target_file making_file' % argvs[0]
10: quit()
11: f = open(argvs[1])
12: lines2 = f.readlines()
13: f.close()
14: nf = open(argvs[2], 'w')
15: i = 1
16: for line in lines2:
17: nf.write('%3d: %s' % (i, line))
18: i = i + 1
19: nf.close()

Rで統計: *.Rソースファイルの読み込みと実行 - source()関数

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

これまでの例は数行のコマンドでしたのでプロンプトに直接を打っていましたが、何十行というロジックをプロンプトに順々に打っていくのは非効率です。今回は、予め外部のテキストファイルにソースコードを書き、そのファイルをプロンプトから呼び出す手順を次の例で示します。

以下のソースコードを拡張子Rのテキストファイルで保存し、プロンプトから読み込んで実行してみましょう。

test.R

batting2007 <- c(193, 204, 172, 177, 175, 155, 122, 118, 120, 139)
print(batting2007)

このテキストファイルを作業ディレクトリにおきます。なお、作業ディレクトリの設定方法はこちらをご覧ください。→作業ディレクトリの設定と確認 - setwd()、getwd()関数

プロンプト

> source("test.R")
[1] 193 204 172 177 175 155 122 118 120 139
>

print()関数を用いて画面へ出力しています。

ここで、この状態のままプロンプトで以下のように入力すると、

> summary(batting2007)
Min. 1st Qu. Median Mean 3rd Qu. Max.
118.0 126.2 163.5 157.5 176.5 204.0
> mean(batting2007)
[1] 157.5
>

このように、読み込んだソースファイル中の変数が使えることが分かります。これは、関数宣言等を別ファイルに保存し、プロンプトから呼び出したい場合によく使います。