BOM付きUTF-8からBOMを除去するpython

BOM付きUTF-8からBOMを除去するpython

Windowsのメモ帳でUTF-8のファイルを出力するとBOM(Byte Order Mark)が付与されてしまう。
これはjavaで読むとき邪魔なので、pythonスクリプトで除去してしまう。

1
2
3
4
5
import codecs
with codecs.open('bom_file.txt', 'r', 'UTF-16') as r:
    with codecs.open('file.txt', 'w', 'UTF-8') as w:
        for line in r:
            w.write(line)

BOMはファイルの先頭3バイトを捨てれば良いだけなので、わざわざpythonスクリプトを作成する必要はないが、既存のjavaプログラムを修正したくなかったのでこのようなスクリプトを作成した。
このスクリプトを噛ませると、BOMがあってもなくても結果的にBOM無しのUTF-8のファイルが出来上がる。

同じタグの記事
同じカテゴリの記事

eclipseデフォルトの文字コード

eclipseデフォルトの文字コード

java開発では標準的に使っているeclipse。
今回は軽量な環境を使いたかったので重いpleiades all in oneでは無く、eclipseに必要なモジュールを追加しながら環境を整えた。
設定も自分で一から行う必要があった。

そんな中でハマったのがJSPの文字コード。
今回の仕事では既存JSPを改修する必要がある。
そこには日本語のコメントが多数書かれているが、そこが文字化けしてしまう。
ファイルを1つずつ、Propertiesを開いて Text file encodingを「Other:UTF-8」に変更しても良いのだけれども、ファイル開くたびに実行するのは面倒。

対処

Geneal > Content Types > Contet types: > Text > JSPと選択すると、画面の一番下に Default encoding: の欄がある。ここの設定を Default encoding: UTF-8 と指定する。
なお元々の設定は ISO-8859-1(ラテン・アルファベットの文字コード。Latin-1)。

この設定の優先度がとても強く、他の設定より優先されていた。

同じタグの記事
同じカテゴリの記事

eclipseの良く使うショートカットキー

eclipseの良く使うショートカットキー

タブの切り替え

Ctrl + E

このキーを押すと現在開いているタブのリストが表示される。
そのままキーワードを入力して絞り込みをしてEnterを押しても良いし、カーソルキーの上下で選択してEnterを押しても良い。
eclipse4.7oxygenからは、タブのリストがカーソル位置に出るのでさらに便利。

リソースを開く

Ctrl + Shift + R

クラス名やファイル名はなんとなくわかっているけど、
そこまでパスを辿るのが面倒なときは、これで簡単にリストを表示できる。

この機能と合わせて使いたい機能は「プロジェクトを閉じる」。
複数のプロジェクトを開いていると、全てのプロジェクトから検索してしまい、今回は必要としないファイルも検索されることがある。
それを避けるため、あまり使っていないプロジェクトはプロジェクトを閉じておくことで、検索結果がスッキリする。
プロジェクトを閉じる方法は、プロジェクトを右クリックして「Close Project」をクリックするか、
プロジェクトを選択してからメニューの「Project」-「Close Project」を選択する。

戻る

Alt + Left

クラスやメソッドの定義へF3でジャンプした後に、元の場所に戻る。
この機能が使えるから、気軽にジャンプできる。

同じタグの記事
同じカテゴリの記事

pythonでlogging

pythonでlogging

ツール的に使っているpythonだが、処理速度を上げるためにマルチスレッド化させたり、ツール規模が大きくなってモジュール化させたり、少し凝った事をすると、printでの実行ログ出力では物足りなくなる。
pythonではloggingの仕組みも標準で組み込まれている。

準備

1
2
import logging.config
logging.config.fileConfig('logging.conf')

logging.confにログ出力設定を書いておき、loggingを初期化する。
初期化とは、ログの出力情報(出力先、出力フォーマットなど)を設定すること。
logging.confの内容は下記の通り

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[loggers]
keys=root

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=INFO
handlers=consoleHandler,fileHandler

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('Log.txt', 'w', 'utf-8', False)

[formatter_simpleFormatter]
format=%(asctime)s [%(levelname)-5s] (%(module)s).(%(funcName)s).(%(lineno)d) %(message)s

コンソールとファイルにログを出力している。

もっとシンプルに初期化したい時は、logging.basicConfigを呼び初期化する。

1
2
3
4
5
import logging
logging.basicConfig(
    format='%(asctime)s [%(levelname)-7s] (%(funcName)s) %(message)s',
    level='INFO',
)

コンソールに処理時間とログレベルと関数名、メッセージを表示する。
処理時間が表示されるだけでも、便利なことも多い。
関数名が表示されるので、処理状況を確認しやすい。

ログの出力

1
2
3
4
logging.debug('debug message.')
logging.info('information message.')
logging.warn('warning message.')
logging.error('error message.')

loggingに用意されたショートカットメソッド(info,errorなど)で簡単にログを出力できる。
ちなみに、上記の準備ではログレベルをINFOにしているため、ログ出力の例のdebug message.は出力されない。

各モジュールでのlogの実装

各モジュールでは、loggerを生成し、
そのloggerでメッセージを出力する。

1
2
3
def another_function():
    logger = logging.getLogger(<strong>name</strong>)
    logger.info('process start!')

このように実装しておくことで、呼び出し元がログ出力を制御できる。
出力先を変えたり、出力すべきログレベルを変更したり、
それ用のhandlerを用意したりできる。

同じタグの記事
同じカテゴリの記事

touchコマンドでファイルのアクセス時刻変更

touchコマンドでファイルのアクセス時刻を変更

Linuxサーバ上でデータ操作を行っていると、ファイルのアクセス日時を変更したい時がある。
データの改ざんをしたい訳でなく、ファイルのアクセス日時を見てファイルを処理するプログラムが存在するため。
そんな時に利用するコマンド。

1
touch -acmt 09061500 target_file.txt

このコマンドでtarget_file.txtのアクセス日時が9月16日の午後3時になる。

なお、オプションの詳細は下記の通り

-a アクセス時刻のみを変更する。
-c ファイルを作成しない。
-m 修正時刻を変更する。
-t time timeで指定した時刻を使い変更する。

基準となるファイルが存在する場合、その日時を利用することもできる。

1
touch -acmr original_file.txt target_file.txt

しかし、これをcpの結果に対して実行するのであれば、最初からcpのオプションに-pをつければ、時刻もコピーされる。

1
cp -p originate_file.txt target_file.txt
同じタグの記事
同じカテゴリの記事

pythonで設定ファイル

pythonで設定ファイルを使う

サーバ名やユーザID・パスワード、参照先のパスなど、オンコーディングしたくない値がどうしてもある。そんなとき、pythonではiniファイル形式の設定ファイルを簡単に扱えるモジュールが標準機能で準備してある。

実装例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import ConfigParser
'python3ではimport configparser'

'''設定ファイルの作成'''
s_config = ConfigParser.ConfigParser()
'python3ではs_config = configparser.ConfigParser()'
s_config.add_section('Section1')
s_config.set('Section1', 'Key1', 'Value1')
s_config.set('Section1', 'Key2', 'Value2')
s_config.add_section('Section2')
s_config.set('Section2', 'Key3', 'Value4')
s_config.set('Section2', 'Key4', 'Value4')
with open('Config.ini', 'wb') as w:
    s_config.write(w)

'''設定ファイルの読み込み'''
r_config = ConfigParser.ConfigParser()
r_config.read('Config.ini')
print(r_config.get('Section1', 'Key1'))
print(r_config.get('Section2', 'Key4'))

このサンプルでは、iniファイルの作成もプログラムで行なっているが、iniファイル形式のファイルなので、テキストエディタで直接、設定ファイルを作成しても問題ない。

ちなみに、上記の例で作成されるConfig.iniは下記の通り。

[Section1]
key1 = Value1
key2 = Value2

[Section2]
key3 = Value4
key4 = Value4
同じタグの記事
同じカテゴリの記事

pythonでftp取得自動化

pythonでftp取得自動化

短期間のバックアップ目的で、毎日FTP受信しているファイル群がある。
サイズも小さいし、それほど手間ではないので手作業を実施していたが、
やはり面倒になってきたので、pythonスクリプトを作成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python

import os
import logging
import ftplib

local_dat_dir = 'data/'
server_dat_dir = '/data_dir'

print('start.')

''' ダウンロード済みのファイルリスト作成 '''
for f in os.listdir(local_dat_dir):
    exists_list.append(f)

''' ダウンロードされていないファイルのダウンロード '''
try:
    ''' FTP接続し、サーバのデータディレクトリに移動 '''
    ftp = ftplib.FTP('ftp-server')
    ftp.login('ftp-user', 'ftp-password')
    ftp.cwd(dat_dir)
    ''' サーバに存在するファイルでループ '''
    for path in ftp.nlst(server_dat_dir):
        ''' パスを除去する
        filename = path[len(server_dat_dir) + 1:]
        '''
ダウンロードされていない場合は、ダウンロードする。 '''
        if not filename in exists_list:
            print('ftp get start. [{}]'.format(filename))
            # ダウンロード
            with open('{}/{}'.format(local_dat_dir, f), 'wb') as w:
                ftp.retrbinary('RETR {}'.format(f), w.write)
            print('ftp get end.')
finally:
    '''
FTP切断 '''
    ftp.quit()
print('end.')

こんな簡単なスクリプトでFTP受信できるのであれば、もっと早く作るべきだった。

同じタグの記事
同じカテゴリの記事