CSVやテキストファイルを使ってアプリケーション間でデータ連携を行う場合、文字コードや改行コードの違いから文字化けやエラーが発生することがあります。
この記事では、Pythonを使った文字コード/改行コード変換ツールを紹介しています。
簡易的なUIを搭載しており、指定したフォルダ内のファイルを一括変換可能です。
また、文字コード/改行コードの処理は関数化しているので、ご自身のソースコードにコピペしてお使いいただけます。
自作ツールを作るためのポイントと今後公開予定の自作ツール一覧を「【実践】Pythonで事務処理向け自作ツールを作ろう!」で紹介していますので、併せてご覧ください。
文字コード/改行コード変換ツールの概要
今回紹介する「文字コード/改行コード変換ツール」は、次の特徴があります。
- 指定したフォルダ内のファイルを一括変換可能です。
- ワイルドカードに一致するファイルのみ変換可能です。
- 文字コードと改行コードの同時変換が可能です。
- 変換元フォルダ、出力先フォルダはドラッグ&ドロップで指定可能です。
- 設定画面に入力した内容は、画面を閉じる際に自動でjsonファイルに保存されます。
文字コード/改行コード変換ツールの使い方
画面項目の説明
画面項目 | 説明 |
---|---|
変換元フォルダ | 変換したいファイルを格納しているフォルダ名 |
ワイルドカード | 変換したいフォルダに適用するワイルドカード |
変換元文字コード | 変換元の文字コード |
変換先文字コード | 変換先の文字コード |
変換元改行コード | 変換元の改行コード |
変換先改行コード | 変換先の改行コード |
出力先フォルダ | 出力先のフォルダ名 |
コード変換ボタン | コード変換の実行 |
コード変換の手順
- 変換したいファイルを格納したフォルダを「変換元フォルダ」に指定します。
- 「変換先フォルダ」に適用するワイルドカードを指定します。
- 変換元の文字コードと、変換先の文字コードを指定します
- 必要に応じて、変換元改行コードと変換先改行コードを指定します。
- 変換したファイルの出力先フォルダを指定します
- コード変換ボタンをクリックします。
<選択可能な文字コード一覧>
文字コード | 説明 |
---|---|
shift_jis | 日本語用のエンコーディング。Windowsで広く使用。 |
utf_8 | 可変長(1~4バイト)のエンコーディング。Unicodeの標準。 |
utf_16 | 2バイト単位のエンコーディング。BOM付き。 |
euc_jp | 日本のUnix系システムで多く使用される日本語エンコーディング。 |
iso2022_jp | メールやネットワークで使われる日本語エンコーディング。 |
ascii | 英数字用の7ビットエンコーディング。 |
<選択可能な改行コード一覧>
文字コード | 説明 |
---|---|
空白 | 改行コード変換を行わない |
CRLF | Windows標準の改行コード(\r\n) |
LF | unix標準の改行コード(\n) |
CR | Mac (特にOS 9以前)で使われていた改行コード(\r) |
動作環境の設定
事前に、Pythonのインストールが必要です。環境構築がお済みでない場合、次の記事を参考に構築してください。
自作ツールのためのポータブルPython開発・実行環境を作ろう! | プログラム実行時に必要 |
WinPythonにVSCode Portable版を入れよう! | プログラム修正時に必要 |
Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。
pip install customtkinter
pip install tkinterdnd2
文字コード/改行コード変換ツールと共通パッケージの2つをダウンロードし、2つのフォルダが同一階層になるように解凍してください。
文字コード/改行コード変換ツール
実行方法
次の手順で実行してください。
- WinPython のインストールフォルダ内にある command.bat を実行
- ダウンロードしたプログラムファイルをコピーした場所にカレントディレクトリを移動
- Python main.py を実行
Python main.py
しばらくすると下記の画面が表示されます。ワイルドカード以外は空白で表示されます。必要な箇所を入力し、コード変換ボタンをクリックしてください。
ちなみに、ワイルドカードは前回の変更内容を保存しないようにしています。
実行すると、変換されたファイル名がコマンドプロンプトに都度表示されます。
文字コード/改行コード変換ツールの仕様
プログラムの構成
main.py の中で画面の表示と「コード変換」ボタンのイベント処理を記述しています。イベント処理の中でconvert_encoding.pyを呼び出し、convert_encoding関数にてコード変換を行っています。
モジュール名 | 役割 |
---|---|
main.py | 画面の表示とボタンクリックのイベント処理 |
convert_encoding.py | 文字コード/改行コード変換処理 |
create_ui.py | UI定義ファイルを読み込み、記述されたウィジェットを画面表示 |
customtkinter | ファイル選択やフォルダ選択、ドラッグ&ドロップを実現するための補助 |
appconfig.py | 画面に入力された値をJson形式のファイルに保存/読込する |
ソースコード
main.py
UI画面の表示と「コード変換」ボタンの処理が記述されています。
import os
import sys
sys.path.append(os.path.join(os.path. dirname(__file__), '../libs'))
from create_ui import CreateUI
from convert_encoding import convert_encoding
from file_util import FileUtil
# ボタンが押された時の処理
def func(param):
input_folder = param["input_folder"]
output_folder = param["output_folder"]
sour_charcd = param["input_char_combo"]
dest_charcd = param["output_char_combo"]
sour_lfcd = param["input_lf_combo"].replace("CR","\r").replace("LF","\n")
dest_lfcd = param["output_lf_combo"].replace("CR","\r").replace("LF","\n")
wildcard = param["_wildcard_entry"]
fu = FileUtil()
files = fu.get_files(input_folder,wildcard=wildcard)
for file in files:
_,name = os.path.split(file)
input_file = os.path.join(input_folder,name)
output_file = os.path.join(output_folder,name)
convert_encoding(input_file, output_file,
encoding_from=sour_charcd, encoding_to=dest_charcd,
newline_from=sour_lfcd, newline_to=dest_lfcd)
# インスタンス生成
ui = CreateUI(func)
# 画面の表示
ui.show()
zip_util.py
このファイルには、次の2つの関数が含まれています。
関数名 | 説明 |
---|---|
convert_encoding( input_file, # 入力ファイルパス output_file, # 出力ファイルパス encoding_from, # 読み込む際の文字コード encoding_to, # 書き込む際の文字コード newline_from, # 読み込む際の改行コード newline_to, # 書き込む際の改行コード ) | 指定されたフォルダにあるファイルに対して、ワイルドカードに一致するファイルを取り出し、文字コード及び改行コードの変換を行います。 |
open 関数でファイルをオープンし、 write関数で出力する場合、自動的にOSに応じた改行コードに変換されてしまいます。これを防ぐため open 関数の newline 引数に空文字("") を指定しています。
def convert_encoding(input_file, output_file, encoding_from='utf-8', encoding_to='utf-8', newline_from="", newline_to=""):
"""
ファイルを1回オープンして文字コードと改行コードを変換する方法
Parameters:
- input_file: 入力ファイルパス
- output_file: 出力ファイルパス
- encoding_from: 読み込む際の文字コード
- encoding_to: 書き込む際の文字コード
- newline_from: 読み込む際の改行コード
- newline_to: 書き込む際の改行コード
"""
# ファイルを開いてエンコードと改行コードを指定。
# 勝手に改行コード変換されないよう newline="" を指定。
with open(input_file, 'r', encoding=encoding_from, newline="") as infile, \
open(output_file, 'w', encoding=encoding_to, newline="") as outfile:
for line in infile:
# 改行コードが同じ場合は、rstripせずにそのまま書き込む
if newline_from == newline_to or newline_to == "" or newline_from == "":
outfile.write(line)
else:
# 異なる場合は元の改行コードを削除し、新しい改行コードを追加
outfile.write(line.rstrip(newline_from) + newline_to)
print(f"{input_file}を変換しました")
design.txt
title:コード変換ツール
mode:light
max:1024,420
size:600,420
min:600,420
input_folder:変換元フォルダ,フォルダ選択
{
label:ワイルドカード
_wildcard_entry:400,*.*
}
{
label:文字コード変換 変換元
input_char_combo:shift_jis,utf_8,utf_16,euc_jp,iso2022_jp,ascii
label:⇒ 変換先
output_char_combo:shift_jis,utf_8,utf_16,euc_jp,iso2022_jp,ascii
}
{
label:改行コード変換 変換元
input_lf_combo:,CRLF,LF,CR
label:⇒ 変換先
output_lf_combo:,CRLF,LF,CR
}
output_folder:出力先フォルダ,フォルダ選択
exec_button:コード変換
design.txt の記述方法については、下記の記事で詳しく解説しています。
まとめ
今回は、「文字コード/改行コード変換ツール」について、環境構築の手順と使い方、ソースコードを紹介しました。
フォルダ内のファイルに対して一括変換が可能で、その中からワイルドカードで絞り込むこともできます。直前に指定した変換元フォルダと出力先フォルダを覚えているため、ルーチンワークに最適です。
再利用しやすいように、圧縮処理と解凍処理は関数化していますので、必要に応じてコピペしてお使いください。
コメント