テキストデータを扱ってると頭にくる!
※2023/7/19 バグを見つけたので、改修しました。
ついでにフォルダ指定をGUIで出来るようにしました。
テキストデータを解析しようとすると、めっちゃ頭にくることがありませんか?
そう。エンコーディングです。
なんでこんなに種類があるんだ!
windowsはshift-JISが多いけど、他にascii,unicode,utf-8,utf-16,utf-32さらに、BOM付とか無しとか、モー、わけわからん。
テキストを扱うプログラム作ると、予期せぬことの原因が、エンコードってよくありませんか?
文字化けすれば、なんとなくわかるけど、BOM付だと、最初に?が入ったり、utfだと、読み込みがエラーになったり。
プログラムのデバッグの最中に、関係ないところを変更して、悩んだことないですか?
私は結構あります。
ということで、このテキストのencodingは何だ?を表示するプログラムをpythonで作りました。
ちょっといじると、中身の表示もできます。
ということで、ソース公開します。
import os.path
from glob import glob
import chardet
import tkinter
import tkinter.filedialog
import tkinter.messagebox
# フォルダ選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()
tkinter.messagebox.showinfo('テキストファイルのエンコード表示', '確認対象ディレクトリを選択してください!')
scan_path = tkinter.filedialog.askdirectory()+"/*"
filepaths = glob(scan_path) # globで一気に全ファイル名を取得できる。
# ファイルごとに処理
for file in filepaths:
if os.path.isfile(file):
# ファイルをバイナリモードで読み込む
# print(f"・・・ファイル名: {file} 確認中")
with open(file, "rb") as f:
root, ext = os.path.splitext(file)
data = f.read()
# 文字コードやエンコーディングを推定する
encoding = chardet.detect(data)["encoding"]
# 文字コードやエンコーディングがNoneでない場合はテキストデータと判断する
if encoding is not None:
text = data.decode(encoding)
print(f"ファイル名: {file}")
print(f"文字コード: {encoding}")
# else:
# print(f"ファイル名: {file} は、テキストファイルではありません。")
ちなみに、私のwindows10のhostsは、UTF-8-SIGって出るんです。
これって正常?
UTF-8-SIGって、よくわからないけどBOM付のUTF-8なのかな?