Pythonの文字列と入出力を理解する|f-string・input・型変換の基本

「Pythonの文字列と入出力を理解する|f-string・input・型変換の基本」の内容を表す技術イラスト

プログラムが扱うのは数値だけではありません。部品名、材料記号、ファイル名、CSVの1行、ユーザーが入力した値など、多くのデータは最初に文字列として受け取ります。

Pythonでは文字列をstr型で表します。

part_name = "Hydraulic cylinder"
material = "S45C"

print(type(part_name))

実行結果です。

<class 'str'>

この記事では、文字列の作成と加工から、input()による入力、数値への型変換、入力検証までを扱います。

目次

今日の到達点

この記事を読み終えると、次のことができるようになります。

  • 単一引用符と二重引用符を使い分けられる
  • 改行などをエスケープシーケンスで表現できる
  • 文字列を連結し、必要な範囲をスライスで取り出せる
  • strip()、replace()、split()などの基本メソッドを使える
  • f-stringで値と単位を読みやすく表示できる
  • input()の戻り値が文字列であることを説明できる
  • 入力文字列を数値へ変換し、不正な値を検出できる

文字列を作る

Pythonでは、文字列を単一引用符'または二重引用符"で囲みます。

part_name = "Cylinder"
status = 'ready'

print(part_name)
print(status)

実行結果です。

Cylinder
ready

どちらもstr型で、基本的な意味は同じです。文字列の中に引用符がある場合は、外側と内側で種類を変えると読みやすくなります。

message = "It's ready."
label = 'Part name is "Cylinder".'

print(message)
print(label)

実行結果です。

It's ready.
Part name is "Cylinder".

同じ種類の引用符を内部でも使う場合は、直前へバックスラッシュ\を置いてエスケープします。

message = 'It\'s ready.'
label = "Part name is \"Cylinder\"."

エスケープとは、本来は文字列の終わりなどを表す記号を、通常の文字として扱わせる記法です。

改行やタブを表す

バックスラッシュから始まる特別な文字の組み合わせを、エスケープシーケンスと呼びます。

代表例は次のとおりです。

記法意味
\n改行
\tタブ
\\バックスラッシュ
\"二重引用符
\'単一引用符
report = "Part: Cylinder\nPressure: 14 MPa\nStatus: Ready"

print(report)

実行結果です。

Part: Cylinder
Pressure: 14 MPa
Status: Ready

複数行の文字列は、三重引用符でも記述できます。

report = """Part: Cylinder
Pressure: 14 MPa
Status: Ready"""

Pythonの文字列リテラルとエスケープシーケンスについては、Python公式チュートリアルで確認できます。

raw文字列

文字列の先頭へrを付けると、多くのエスケープシーケンスを展開しないraw文字列になります。

pattern = r"\d+\.\d+"

print(pattern)

実行結果です。

\d+\.\d+

正規表現など、バックスラッシュを多く含む文字列で便利です。ただし、raw文字列でも引用符に関する規則は残り、末尾を奇数個のバックスラッシュだけで終えることはできません。

OS固有のパスを記事やプログラムへ直接埋め込むための機能だと決めつけず、「バックスラッシュの解釈を抑える文字列」と理解しておきましょう。

文字列を連結する

+を使うと文字列同士を連結できます。

part_name = "Cylinder"
status = "Ready"

message = part_name + ": " + status

print(message)

実行結果です。

Cylinder: Ready

*を使うと文字列を繰り返せます。

separator = "-" * 20

print(separator)

実行結果です。

--------------------

文字列と数値は、そのままでは連結できません。

pressure_mpa = 14.0
message = "Pressure: " + pressure_mpa

このコードはTypeErrorになります。連結するならstr()で数値を文字列へ変換できます。

pressure_mpa = 14.0
message = "Pressure: " + str(pressure_mpa) + " MPa"

print(message)

ただし、複数の値を組み込む場合は、後述するf-stringの方が読みやすくなります。

インデックスとスライス

文字列内の各文字には、先頭を0とする位置番号があります。この番号をインデックスと呼びます。

label = "Cylinder"

print(label[0])
print(label[1])
print(label[-1])

実行結果です。

C
y
r

負のインデックスは末尾から数えます。-1が最後の文字です。

連続する範囲を取り出すにはスライスを使います。

label = "Cylinder"

print(label[0:3])
print(label[3:8])
print(label[:3])
print(label[3:])

実行結果です。

Cyl
inder
Cyl
inder

[開始位置:終了位置]では、開始位置の文字を含み、終了位置の文字は含みません。

文字数はlen()で取得できます。

label = "Cylinder"

print(len(label))

実行結果です。

8

存在しない位置をインデックスで指定するとIndexErrorになります。

label = "Cylinder"
print(label[20])

一方、スライスの終了位置が文字列の長さを超えても、取得できる範囲までが返ります。

print(label[:20])

実行結果です。

Cylinder

文字列は変更できない

Pythonの文字列はイミュータブル、つまり作成後に文字単位で変更できないオブジェクトです。Python公式ドキュメントでは、文字列はUnicodeコードポイントからなる不変のシーケンスと定義されています。

次の代入はできません。

label = "cylinder"
label[0] = "C"

新しい文字列を作成して変数へ代入し直します。

label = "cylinder"
label = "C" + label[1:]

print(label)

実行結果です。

Cylinder

文字列メソッドを使用した場合も、元の文字列を書き換えるのではなく、加工後の新しい文字列が返ります。

よく使う文字列メソッド

前後の空白を除去する

strip()は、文字列の先頭と末尾から空白文字を取り除いたコピーを返します。

raw_name = "  cylinder-A  "
part_name = raw_name.strip()

print(part_name)

実行結果です。

cylinder-A

ユーザー入力やCSVの値には、意図しない空白が含まれることがあります。入力直後にstrip()を適用すると扱いやすくなります。

ただし、文字列の途中にある空白は削除されません。

大文字と小文字を変換する

status = "Ready"

print(status.lower())
print(status.upper())

実行結果です。

ready
READY

大文字と小文字を区別せず状態を比較したいときは、比較前に表記を統一できます。

raw_status = " READY "
status = raw_status.strip().lower()

print(status == "ready")

実行結果です。

True

一部を置換する

replace()は、指定した文字列を別の文字列へ置き換えます。

dimension = "80 mm"
normalized = dimension.replace(" ", "_")

print(normalized)

実行結果です。

80_mm

区切り文字で分割する

split()は、文字列を区切り文字ごとに分割します。

record = "PRESSURE,14.5,MPa"
fields = record.split(",")

print(fields)
print(fields[0])
print(fields[1])
print(fields[2])

実行結果です。

['PRESSURE', '14.5', 'MPa']
PRESSURE
14.5
MPa

戻り値は文字列ではなくリストです。リストはDay 4で詳しく扱います。

実際のCSVには、引用符で囲まれたカンマや改行が含まれる場合があります。そのため、本格的なCSV処理を単純なsplit(",")だけで済ませず、Day 11で扱うcsv標準ライブラリを使用します。

f-stringで値を埋め込む

f-stringは、文字列の先頭へfを付け、波括弧{}内へ変数や式を書く記法です。

part_name = "Cylinder"
pressure_mpa = 14.0

message = f"{part_name}: {pressure_mpa} MPa"

print(message)

実行結果です。

Cylinder: 14.0 MPa

数値の表示形式も指定できます。

pressure_mpa = 14.5678

print(f"Pressure: {pressure_mpa:.2f} MPa")

実行結果です。

Pressure: 14.57 MPa

.2fは、浮動小数点数を小数点以下2桁で表示する指定です。これは表示形式の変更であり、元の変数へ保存された値自体を変更するものではありません。

Python公式の言語仕様では、f-stringはfまたはFを付けた文字列で、{}内の式が実行時に評価されると定義されています。f-stringの公式仕様を参照してください。

inputで入力を受け取る

input()を使うと、キーボードから1行の入力を受け取れます。

part_name = input("Part name: ")

print(f"Selected part: {part_name}")

実行例です。

Part name: Cylinder
Selected part: Cylinder

input()へ渡した文字列は、入力を促すプロンプトとして改行せず表示されます。入力された行は、末尾の改行が取り除かれたstrとして返ります。Python組み込み関数input()にこの動作が定義されています。

重要なのは、数字を入力しても結果は文字列だという点です。

pressure_text = input("Pressure [MPa]: ")

print(type(pressure_text))

14と入力した場合でも型は次のようになります。

<class 'str'>

入力文字列を数値へ変換する

小数を含む数値へ変換するにはfloat()、整数へ変換するにはint()を使います。

pressure_text = "14.5"
count_text = "12"

pressure_mpa = float(pressure_text)
part_count = int(count_text)

print(pressure_mpa)
print(part_count)

実行結果です。

14.5
12

int("14.5")は整数形式の文字列ではないため、ValueErrorになります。

int("14.5")

また、次のように一度floatへ変換してからintへ変換すると、小数部分は四捨五入されず、ゼロ方向へ切り捨てられます。

print(int(float("14.9")))

実行結果です。

14

個数の入力に小数を許可しないのであれば、変換によって黙って小数部分を捨てるのではなく、整数形式であることを検証すべきです。

入力値を無条件に信用しない

input()で値を受け取れたことと、その値を計算へ使用できることは別です。

たとえば圧力の入力には、次の問題が考えられます。

  • 何も入力されていない
  • 数値ではなくhighと入力された
  • 負の値が入力された
  • 想定単位がMPaなのにPaの値が入力された
  • NaNや無限大など、通常の計算へ使えない値が入力された

次の例では、入力を数値へ変換できるか、有限の正数であるかを確認します。

import math

pressure_text = input("Pressure [MPa]: ").strip()

if pressure_text == "":
    print("入力が空です")
else:
    try:
        pressure_mpa = float(pressure_text)
    except ValueError:
        print("数値として解釈できません")
    else:
        if not math.isfinite(pressure_mpa):
            print("有限の数値を入力してください")
        elif pressure_mpa <= 0:
            print("0より大きい値を入力してください")
        else:
            print(f"入力値: {pressure_mpa:.2f} MPa")

tryは変換を試す部分、except ValueErrorは数値へ変換できなかった場合の処理です。例外処理の仕組みはDay 8で詳しく扱います。

入力と結果の対応例です。

入力結果
14.5入力値: 14.50 MPa
空文字列入力が空です
high数値として解釈できません
-20より大きい値を入力してください
nan有限の数値を入力してください

float()が成功しても、工学的に妥当な値とは限りません。型、範囲、単位、有限性を分けて確認する必要があります。

実務例:入力から理論推力を表示する

部品名、圧力、シリンダ内径を入力し、理論推力を表示します。A=πD24A=\frac{\pi D^2}{4}F=pAF=pA

  • DD:内径 mm
  • AA:受圧面積 mm²
  • pp:圧力 MPa
  • FF:理論推力 N
  • 1 MPa=1 N/mm21\ \mathrm{MPa}=1\ \mathrm{N/mm^2}
import math

part_name = input("Part name: ").strip()
pressure_text = input("Pressure [MPa]: ").strip()
bore_text = input("Bore [mm]: ").strip()

if part_name == "":
    print("部品名を入力してください")
else:
    try:
        pressure_mpa = float(pressure_text)
        bore_mm = float(bore_text)
    except ValueError:
        print("圧力と内径には数値を入力してください")
    else:
        values_are_finite = (
            math.isfinite(pressure_mpa)
            and math.isfinite(bore_mm)
        )

        if not values_are_finite:
            print("有限の数値を入力してください")
        elif pressure_mpa <= 0 or bore_mm <= 0:
            print("圧力と内径には0より大きい値を入力してください")
        else:
            area_mm2 = math.pi * bore_mm ** 2 / 4
            force_kn = pressure_mpa * area_mm2 / 1000

            print(f"{part_name}: {force_kn:.2f} kN")

入力例です。

Part name: cylinder-A
Pressure [MPa]: 14
Bore [mm]: 80

実行結果です。

cylinder-A: 70.37 kN

主要な計算処理と検証分岐はPython 3.12.14で実行確認済みです。

この結果は摩擦、背圧、圧力損失、安全率を含まない理論値です。文字列を正しく数値へ変換できても、数式の前提が自動的に保証されるわけではありません。

よくある失敗

引用符を閉じていない

part_name = "Cylinder

文字列が終了していないため、SyntaxErrorになります。

inputの結果をそのまま計算する

pressure_mpa = input("Pressure [MPa]: ")
result = pressure_mpa * 2

文字列へ整数を掛けると、数値計算ではなく文字列の繰り返しになります。14を入力した場合、結果は1414です。

pressure_mpa = float(input("Pressure [MPa]: "))
result = pressure_mpa * 2

型変換に加えて、不正入力への対応も必要です。

stripしただけで安全だと思う

strip()が除去するのは主に前後の空白です。内容が数値か、許容範囲内か、単位が正しいかまでは確認しません。

value = " high ".strip()

結果は"high"であり、数値にはなっていません。

表示文字列を計算へ再利用する

formatted_pressure = f"{14.5:.2f} MPa"

これは表示用の文字列です。計算用の数値14.5と、表示用の"14.50 MPa"は別々に扱いましょう。

練習問題

部品コードを分割する

文字列"CYL-080-014"から、種類、内径、圧力コードを取り出してください。

解答例です。

part_code = "CYL-080-014"
fields = part_code.split("-")

print(fields[0])
print(fields[1])
print(fields[2])

実行結果です。

CYL
080
014

実務では、分割後の要素数も確認する必要があります。

前後の空白と表記をそろえる

入力文字列" READY "を"ready"へ変換してください。

解答例です。

raw_status = "  READY  "
status = raw_status.strip().lower()

print(status)

実行結果です。

ready

流量を変換して表示する

文字列"120"を数値へ変換し、L/minからL/sへ換算して小数点以下2桁で表示してください。

解答例です。

flow_text = "120"
flow_l_min = float(flow_text)
flow_l_s = flow_l_min / 60

print(f"Flow: {flow_l_s:.2f} L/s")

実行結果です。

Flow: 2.00 L/s

確認する観点は、型変換、単位換算、f-stringの表示形式です。

まとめ

Pythonでは、外部から受け取ったデータの多くを文字列として扱います。

  • 文字列はstr型で表す
  • 単一引用符と二重引用符を利用できる
  • \nなどのエスケープシーケンスで特殊文字を表せる
  • インデックスは0から始まり、スライスの終了位置は含まれない
  • 文字列はイミュータブルで、文字単位の変更はできない
  • strip()、lower()、replace()、split()で文字列を加工できる
  • f-stringで変数と単位を読みやすく表示できる
  • input()は常に文字列を返す
  • float()やint()による変換は失敗する場合がある
  • 入力値は空欄、型、範囲、単位、有限性を確認する
  • 表示用文字列と計算用数値は分けて保持する

外部から入力された値を無条件に計算へ渡さないことが、データ処理や設計計算を安全に自動化する第一歩です。

参考情報

参考になったらシェアしてください
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

機械設計・油圧・CAD・Python・AIなど、ものづくりに関わる技術を扱っています。工学知識を整理・構造化し、設計や自動化に再利用できる形へ変えていくことを目指しています。

目次