dbfの操作は、dbfpyを利用しました。
- 国勢調査のshapeしかテストしていないので、未知の型だと動かないかも
- sjisじゃない文字列だとエラーになりました。
- 最大文字列長ではなく、フィールド定義の文字列数を2倍にしてます。ファイルサイズが気になる方は、先に一回全レコードを走査して最大文字列長を取るといいと思います。
- マイクロソフト版Shift_jis拡張文字コードのcp932を指定
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from dbfpy import dbf
import os,sys,shutil
#http://dbfpy.sourceforge.net/
def convertDbf(dname):
#バックアップの作成
nname = dname[:-4]+".bk"+dname[-4:]
shutil.move(dname,nname)
db = dbf.Dbf(nname)
bfh = dbf.Dbf(dname, new=True)
#header の作成
for f in db.fieldDefs:
(name , type,len,dec) = f.fieldInfo()
print f
# KEY_CODE C 11 0
# SETAI N 10 0
# X_CODE N 19 5
if type == "C":
bfh.addField((name, type, len*2))
if type == "N":
bfh.addField((name,"N", len, dec))
else:
bfh.addField((name, type, len))
#data のコピーと文字コード変換
for rec in db:
n = bfh.newRecord()
for f in db.fieldDefs:
(name , type,len,dec) = f.fieldInfo()
if type == "C":
n[name] = unicode(rec[name],"cp932").encode('utf-8')
else:
n[name] = rec[name]
n.store()
bfh.close()
#############
for f in os.listdir(os.getcwd()):
if os.path.isfile(f) == True and f[-3:] == "dbf":
print f
convertDbf(f)
合わせて読む
ogr2ogrでshpefileをKML化
娘のサンプルだとKML化後に文字コード変換しているので、事前に変換しておくとよいかも

