【Python】全角と半角を変換する方法を初心者向けに解説

python icon
Python

こんにちは、とまだです。

みなさん、日本語の文字入力で全角と半角を混在させてしまった経験はありませんか?

フォームに住所を入力した時、数字や英字が全角になってしまってエラーが出た...

データを集計しようとしたら、同じ「ABC」でも全角と半角が混在していて重複として扱われた...

こんな場面で困ったことがある方も多いのではないでしょうか。

今回は、Pythonで全角と半角を変換する方法について、初心者でもわかるように解説していきます。

全角と半角の違いを理解しよう

まずは基本から確認しましょう。

全角文字は「A」「1」のように、1文字分の幅をしっかりと使って表示される文字です。

一方、半角文字は「A」「1」のように、半分の幅で表示される文字ですね。

この違い、実は内部的には全く別の文字コードとして扱われているんです。

例えば、データベースに住所を登録する時を想像してみてください。

「東京都港区1-2-3」と「東京都港区1-2-3」では、システム的には別の住所として認識されてしまいます。

これが原因で、重複データが発生したり、検索がうまくいかなかったりする問題が起きるんですね。

Pythonで全角から半角へ変換する基本的な方法

では、実際にPythonで変換する方法を見ていきましょう。

最もシンプルな方法は、str.maketrans()translate()を使う方法です。

基本的な変換コード

以下のコードは、全角英数字を半角に変換する基本的な例です。

def zenkaku_to_hankaku(text):
    # 全角文字と半角文字の対応表を作成
    zenkaku = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    hankaku = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

    # 変換テーブルを作成
    table = str.maketrans(zenkaku, hankaku)

    # 変換を実行
    return text.translate(table)

# 使用例
sample = "Python3で全角を半角に変換"
result = zenkaku_to_hankaku(sample)
print(result)  # 出力: Python3で全角を半角に変換

このコードのポイントは、対応表(テーブル)を作って一括変換している点です。

手紙の住所を書き直す時に、変換ルールを決めておいて、それに従って書き直すイメージですね。

スペースも含めて変換したい場合

実は、スペースにも全角と半角があります。

これも一緒に変換したい場合は、対応表に追加するだけです。

def zenkaku_to_hankaku_with_space(text):
    # スペースも含めた対応表
    zenkaku = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "  # 最後に全角スペース
    hankaku = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "  # 最後に半角スペース

    table = str.maketrans(zenkaku, hankaku)
    return text.translate(table)

# 使用例
sample = "Python 3"  # 全角スペースあり
result = zenkaku_to_hankaku_with_space(sample)
print(f"'{result}'")  # 出力: 'Python 3'

半角から全角への変換も簡単

逆に、半角を全角に変換したい場合もありますよね。

方法は同じで、対応表を逆にするだけです。

def hankaku_to_zenkaku(text):
    # 半角と全角の対応表(逆向き)
    hankaku = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    zenkaku = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

    table = str.maketrans(hankaku, zenkaku)
    return text.translate(table)

# 使用例
sample = "Python123"
result = hankaku_to_zenkaku(sample)
print(result)  # 出力: Python123

実務でよく使う活用例

ここからは、実際の開発でよく使われるシーンを紹介します。

住所データの正規化

ECサイトや会員登録システムでは、住所の表記ゆれを統一することが重要です。

def normalize_address(address):
    # 数字と英字を半角に統一
    address = zenkaku_to_hankaku(address)

    # ハイフンも統一(全角ハイフンや長音記号を半角ハイフンに)
    address = address.replace('-', '-')
    address = address.replace('ー', '-')

    return address

# 使用例
addresses = [
    "東京都港区1-2-3",
    "東京都港区1ー2ー3",
    "東京都港区1-2-3"
]

for addr in addresses:
    normalized = normalize_address(addr)
    print(f"変換前: {addr}")
    print(f"変換後: {normalized}")
    print()

これで、どんな入力パターンでも統一された形式で保存できます。

CSVファイルの一括処理

大量のデータを扱う時は、CSVファイルごと処理することもあります。

import csv

def process_csv_file(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as infile:
        with open(output_file, 'w', encoding='utf-8', newline='') as outfile:
            reader = csv.reader(infile)
            writer = csv.writer(outfile)

            for row in reader:
                # 各セルの全角数字を半角に変換
                normalized_row = [zenkaku_to_hankaku(cell) for cell in row]
                writer.writerow(normalized_row)

    print(f"変換完了: {input_file}{output_file}")

# 使用例(ファイルがある前提)
# process_csv_file('input.csv', 'output.csv')

カタカナの変換にも対応する

カタカナも全角と半角があります。

これまでの方法を応用すれば、カタカナの変換も可能です。

def convert_katakana(text, to_hankaku=True):
    # カタカナの対応表(一部抜粋)
    zenkaku_kata = "アイウエオカキクケコ"
    hankaku_kata = "アイウエオカキクケコ"

    if to_hankaku:
        table = str.maketrans(zenkaku_kata, hankaku_kata)
    else:
        table = str.maketrans(hankaku_kata, zenkaku_kata)

    return text.translate(table)

# 使用例
sample = "カタカナ変換テスト"
print(convert_katakana(sample))  # 半角カタカナに変換

ただし、カタカナの変換は濁点・半濁点の扱いが複雑になるため、実務では専用のライブラリを使うことも検討してみてください。

まとめ

今回は、Pythonで全角と半角を変換する方法について解説しました。

基本的にはstr.maketrans()translate()を使えば、簡単に変換できることがわかりましたね。

実務では、フォーム入力のデータ整形やCSVファイルの処理など、様々な場面でこの技術が活用できます。

特に日本語を扱うシステムでは、全角・半角の統一は品質向上に直結する重要な処理です。

ぜひ今回紹介した方法を活用して、より使いやすいシステムを作ってください。

共有:

著者について

とまだ

とまだ

フルスタックエンジニア

Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。

著者の詳細を見る →