LoginSignup
0
0

【Python】コンソールにいい感じに文字列を表示させるコード

Posted at

本記事はPythonのコンソール画面に日本語文字列を表示させるコードを記述したのでその備忘録です。
本コードはPythonの標準ライブラリを使用しているため、Python自体が古すぎなければ問題なく動くはずです。

まずは、本記事を書くにあたり以下を参照しました。

本コード

printText.py
import unicodedata

def get_string_length(text):
    count = 0
    for c in text:
        if unicodedata.east_asian_width(c) in 'FWA':
            count += 2
        else:
            count += 1
    return count


def insert_char_toString(text, insert_char=' ', text_length=80):
    if(get_string_length(text) >= text_length):
        return text
    return text + insert_char * (text_length - get_string_length(text))


def cut_string_by_length(text, text_length):
    tmp_list = []
    tmp_text = ''
    for idx, c in enumerate(text, 1):
        tmp_text += c
        if(get_string_length(tmp_text) == text_length):
            tmp_list.append(tmp_text)
            tmp_text = ''
        if(get_string_length(tmp_text) == text_length+1):
            tmp_list.append(tmp_text[:len(tmp_text)-1]+' ')
            tmp_text = tmp_text[-1]
        if(idx == len(text)):
            tmp_list.append(insert_char_toString(tmp_text, text_length=text_length))
    return [i for i in tmp_list if i.strip() != '']


def get_split_strings_by_length(texts, text_length=80):
    text_list = []
    for text in texts:
        if text.find('\r\n') or text.find('\n'):
            [text_list.extend(cut_string_by_length(j, text_length)) for j in [i for i in text.replace('\r','').split('\n')]]
        else:
            text_list.extend(cut_string_by_length(text, text_length))
    return text_list


if __name__ == '__main__':

    texts = [
        'unicodedata --- Unicode データベース\r\n\r\n',
        'このモジュールは、すべてのユニコード文字の文字プロパティを定義するユニコード文字データベース (UCD) へのアクセスを提供します。このデータベースに含まれているデータは、 UCD バージョン 15.0.0 から作成されています。',
        'このモジュールは、ユニコード標準付録 #44 「 ユニコード文字データベース 」で定義されているのと同じ名前およびシンボルを使用します。このモジュールは次のような関数を定義します:',
        'unicodedata.east_asian_width(chr)\r\nユニコード文字 chr に割り当てられたeast asian widthを文字列で返します。'
    ]

    print('/**** ' + insert_char_toString('', '-') + ' ****/')
    for string in get_split_strings_by_length(texts):
        print('/**** ' + string + ' ****/')
    print('/**** ' + insert_char_toString('', '-') + ' ****/')

出力結果

上記コードを実行すると以下のように表示されます:

出力.png

簡単な説明

  • 日本語文字列の長さを調べるために unicodedata.east_asian_width を使用。※Pythonでデフォルトで使用可能な len(text) 関数は半角も全角も区別せず1文字として認識してしまう。
  • コンソールに表示する際の文字列長を text_lengthで制御しており、デフォルト長を 80 としています。
  • text_length に満たない文字列は長さが text_length になるまで半角スペースを挿入しています。
  • 改行コードについては、テキストを分割してリストに追加しています。

まとめ

コンソール表示を綺麗に出力できたので満足。
テキストエディタに張り付けると見た目が悲しくなるので画像で表示するにとどめました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0