Python ツール #3 ― ファイルエンコーディングチェッカー

# Python ツール #3 ― ファイルエンコーディングチェッカー

「複数のファイルを読み込んで、それぞれのファイルの文字コードを 1つの Excel ファイルに書き出す」という処理の Python スクリプトを作成しました。

## 実行イメージ

**入力ファイル**
テスト用にさまざまな入力ファイルを用意しています。

![Python_tool-FileEncodingChecker-Input.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529613/d1e218f8-3a2e-7cba-3372-53a9b85f48f2.jpeg)

**出力 Excel ファイル**
ファイルを読み込んで、ファイル文字コードをチェックし、Excel ファイルに出力します。

![Python_tool-FileEncodingChecker-Output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529613/7ed9284a-38ec-a182-7f59-ec35112fa5d9.jpeg)

## 参考にしたソースコード

複数のフォルダーから複数のファイルを取り出すループから、このソースコードの関数を呼び出しているだけです...。

https://qiita.com/koara-local/items/6b47f3156ca66f28b4ab

## ソースコードの簡単な説明

* 各定数値。必要に応じて修正してください。例えば、ファイルのパス “IN_SRC_ROOT” は、D: ドライブからの絶対パスでもよいですし、“file_encoding_checker.py” からの相対パスでもよいです。
    ```python:file_encoding_checker.py
    # Input, Output
    IN_DIR = '.\\input'
    OUT_DIR = '.\\output'
    # IN_SRC_ROOT = 'D:\\Developments\\PyCharmProjects\\tool-file_encoding_checker\\input'  # noqa
    IN_SRC_ROOT = '.\\input'
    IN_SRC_RELATIVE = '\\src'
    IN_EXCEL = IN_DIR + '\\file_encoding_checker_list_template.xlsx'
    OUT_EXCEL = OUT_DIR + '\\file_encoding_checker_list.xlsx'
    OUT_SHEET = 'File Encoding Checker List'
    IGNORE_EXTENDS = ['.dat', '.ini']
    OUT_DEBUG = OUT_DIR + '\\debug.txt'
    ```
* ファイルエンコーディングのチェック関数。
    ```python:file_encoding_checker.py
    # Check File Encoding
    def check_file_encoding(full_path_file):
        detector = UniversalDetector()
        with open(full_path_file, mode='rb') as f:
            for binary in f:
                detector.feed(binary)
                if detector.done:
                    break
        detector.close()
        return detector.result, detector.result['encoding']
    ```
* 複数のフォルダーから複数のファイルを取り出してチェック関数を呼び出すループの処理。
    ```python:file_encoding_checker.py
    # Seek Directories
    def seek_directories(write_excel: WriteExcel, level: int, dir_root: str, dir_relative: str, fp) -> None:
    
        dirs = []
        files = []
    
        for path in os.listdir(dir_root):
            if os.path.isfile(os.path.join(dir_root, path)):
                files.append(path)
            else:
                dirs.append(path)
    
        files.sort(key=str.lower)
        for file in files:
            base, ext = os.path.splitext(file)
            write_excel.write_cell(CELL_COL_NO, write_excel.get_count(), None, None, NUMBER_FORMAT)
            write_excel.write_cell(CELL_COL_PATH, dir_relative, ALIGN_LEFT_NO_WRAP, None, None)
            write_excel.write_cell(CELL_COL_FILE, file, ALIGN_LEFT_NO_WRAP, None, None)
            write_excel.write_cell(CELL_COL_EXT, ext, ALIGN_CENTER, None, None)
            # Ignore Files
            if (base.startswith('.') and ext == '') or ext in IGNORE_EXTENDS:
                atters = None
                encoding = None
            # Other Files
            else:
                atters, encoding = check_file_encoding(os.path.join(dir_root, file))
            if encoding is None:
                write_excel.write_cell(CELL_COL_ENCODING, '-', ALIGN_CENTER, None, None)
            else:
                write_excel.write_cell(CELL_COL_ENCODING, '%s' % encoding, ALIGN_LEFT_NO_WRAP, None, None)
            if atters is None:
                write_excel.write_cell(CELL_COL_ATTERS, '-', ALIGN_CENTER, None, None)
            else:
                write_excel.write_cell(CELL_COL_ATTERS, '%s' % atters, ALIGN_LEFT_NO_WRAP, None, None)
            print('%5d %s %s %s %s %s' %
                  (write_excel.get_count(), dir_relative, file, ext,
                   encoding if encoding is not None else '-', atters if atters is not None else '-'))
            fp.write('%5d %s %s %s %s %s\n' %
                     (write_excel.get_count(), dir_root, file, ext,
                      encoding if encoding is not None else '-', atters if atters is not None else '-'))
    
            write_excel.next_row()
    
        dirs.sort(key=str.lower)
        for dir_nest in dirs:
            seek_directories(write_excel, level + 1,
                             os.path.join(dir_root, dir_nest), os.path.join(dir_relative, dir_nest), fp)

        return
    ```

## ソースコードの置き場所

https://github.com/tengbu-haoshou/Python_tool-file_encoding_checker