お礼
私は、まだ一から作成することが出来ないので、皆様が作成したプログラムを流用して作成しています。ありがとう御座います。
環境
Ubuntu Studio 17.10
LibreOffice6.0
Ubuntu
Python 3.6.3(64bit)
LibreOffice 6.0
Python 3.5.4(64bit)
パッケージの追加
郵便局のサイトから郵便番号のcsvデータをダウンロードして、
https://www.craneto.co.jp/archives/1309/
上記のサイトでcsvの読み込み方を勉強していたのですが、csvファイルがshift_jisでubuntuはutf-8なのでエンコードを指定しなくてはいけません。
上記のサイトに、文字コード判定のモジュールをimport getencと書いてあるのですが、インストールされていないので、pip3 install getencとしてもありません。
ネットで探していたら、
http://myfuturesightforpast.blogspot.jp/2015/01/auto-detecting-japanese-file-enconding.html
上記のサイトに、文字コードの自動判定関数getenc.pyがありました。
これを少し修正して、文字コードの自動判定パッケージgetenc.pyとして、'/home/ty/.local/lib/python3.6/site-packages'に保存しました。
https://qiita.com/ty21ky/items/3b944a7abe23e3bcaf8f
上記のブログでLibreOfficeのバンドルPythonにもパスを追加しているので、Ubuntuのpython3とLibreOfficeバンドルのPython3の両方で文字コードの自動判定パッケージを使用出来るようになりました。
# !/usr/bin/python3
# (File name: getenc.py)
# Lincense: CC0
# http://myfuturesightforpast.blogspot.jp/2015/01/auto-detecting-japanese-file-enconding.html
# 使い方
# $ ./getenc.py 27OSAKA.CSV
# $ ./getenc.py Text.txt
# 使い方(呼び出す場合)
# from getenc import getEncode
#
# getEncode(ファイル名)
# 文字コードの自動判定関数
def getEncode(filepath):
encs = "iso-2022-jp euc-jp shift_jis utf-8".split()
for enc in encs:
with open(filepath, encoding=enc) as fr:
try:
fr = fr.read()
except UnicodeDecodeError:
continue
return enc
if __name__ == '__main__':
import sys
argv = sys.argv
argc = len(argv)
hikisuu = 1
if argc <= hikisuu:
print ("文字エンコードを調べるテキストファイル名を1つを引数として指定します。")
print ("使い方")
print ("$ ./getenc.py テキストファイル.CSV(txt)")
else:
FR = argv[1]
print(getEncode(FR))
これを呼び出すサンプルプログラム
from getenc import getEncode
print(getEncode('/media/ty/HD-LCU3/Post/data/27OSAKA.CSV'))
$ python3 TestGetEncode.py
shift_jis
$ /opt/libreoffice6.0/program/python ./TestGetEncode.py
shift_jis
割と簡単にパッケージを自作することができました。(まだ、プログラムを作ることが出来ないのは寂しいですが。)
https://www.craneto.co.jp/archives/1309/
Python3 で CSV の読み書きをする方法 – Shift_JIS と UTF-8 対応サンプルコード付
上記のサイトを参考にしてというか、ほとんどそのままですが郵便番号のCSVファイルを読み込むプログラムです。
# Python3 標準モジュール csv のインポート
import csv
# getenc モジュールをインポート
from getenc import getEncode
try:
CSVFILE = '/media/ty/HD-LCU3/Post/data/27OSAKA.CSV'
# 文字コードが不明な場合
enc = getEncode(CSVFILE)
with open(CSVFILE, 'r', encoding=enc) as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in csv_reader:
print(','.join(row))
# 起こりそうな例外をキャッチ
except FileNotFoundError as e:
print(e)
except csv.Error as e:
print(e)
$ python3 csv_open_getEncode.py
........
27383,585 ,5850053,オオサカフ,ミナミカワチグンチハヤアカサカムラ,コブキ,大阪府,南河内郡千早赤阪村,小吹,0,0,0,0,0,0
27383,585 ,5850041,オオサカフ,ミナミカワチグンチハヤアカサカムラ,スイブン,大阪府,南河内郡千早赤阪村,水分,0,0,0,0,0,0
27383,585 ,5850051,オオサカフ,ミナミカワチグンチハヤアカサカムラ,チハヤ,大阪府,南河内郡千早赤阪村,千早,0,0,0,0,0,0
27383,585 ,5850052,オオサカフ,ミナミカワチグンチハヤアカサカムラ,ナカツハラ,大阪府,南河内郡千早赤阪村,中津原,0,0,0,0,0,0
27383,585 ,5850042,オオサカフ,ミナミカワチグンチハヤアカサカムラ,ニガラベ,大阪府,南河内郡千早赤阪村,二河原辺,0,0,0,0,0,0
27383,585 ,5850044,オオサカフ,ミナミカワチグンチハヤアカサカムラ,モリヤ,大阪府,南河内郡千早赤阪村,森屋,0,0,0,0,0,0
27383,585 ,5850054,オオサカフ,ミナミカワチグンチハヤアカサカムラ,ヨドシ,大阪府,南河内郡千早赤阪村,吉年,0,0,0,0,0,0
その他の参考にしたサイト
Pythonで自作モジュールを手軽に使う
https://qiita.com/Accent/items/efb57d66309f6c0ee63d