テクノロジー

2023年1月1日

Python入門3 テキストデータ

  • 文字列が扱えるようになる
  • メソッドや関数について公式ドキュメントを読めるようにする

テキストデータ

テキストデータを扱う方法を見ていきます。

テキストデータの表示

テキストデータとして扱うには、”“(ダブルクォーテーション)または’‘(シングルクォーテーション)で文字を囲います。

以下は『「text」という文字列を表示する』というプログラムです。

print("text")

実行すると「text」と表示されます。

数値を扱う場合は整数型や浮動小数点数型でしたが、テキストデータの場合は文字列型(str)となります。strはstringの略称です。単に文字列やstring、またはstr型のように呼ばれることが多いです。

print(type("text"))

スペースを含んだ文字列や、日本語の文字列も扱えます。

print("learn python")
print("こんにちは")

実行すると「<class ‘str’>」と表示されます。

文字列を変数に代入することもできます。

student_name = "Alice"
print(student_name)

《クォーテーションで囲わないとどうなる?》

もしクォーテーションで囲うのを忘れてしまうと、例えば以下のようなエラーメッセージが表示されます。

*以下はエラーになる例です。

print(text)

Image from Gyazo

「NameError: name ‘text’ is not defined」は、textという名前の変数は定義されていないという表示です。クォーテーションで囲わなければ、このアルファベットはPythonにとって変数だと捉えられます。しかし、定義されていない変数名なので名前のエラーとしてプログラムが止まりました。

スペースが入っている文章でクォーテーションを忘れてしまうと、以下のようなエラーメッセージが表示されます。

*以下はエラーになる例です。

print(learn python)

Image from Gyazo

「SyntaxError: invalid syntax」は、無効な文法が使用されているという表示です。こちらは変数だとしても、スペースが空いていることはおかしいので、文法エラーとしてプログラムが止まりました。

このように間違えてしまっても、クォーテーションを忘れているという直接的なメッセージは出てきません。エラーメッセージから、何を間違えてそうなってしまったのかを読み解く力が大切です。

*以下がエラーを解消した例です。

print("text")
print("learn python")

文字列の演算

+を使うことで、文字列を結合することができます。

student_name = "Alice"
print("私の名前は" + student_name + "です。")

数値型を文字列に結合したい場合は、str関数を使い文字列に変換します。

student_age = 19
print("私の年齢は" + str(student_age) + "です。")

もし文字列に変換せずに使うと以下のようなエラーメッセージが表示されます。

*以下はエラーになる例です。

student_age = 19
print("私の年齢は" + student_age + "です。")

Image from Gyazo

「TypeError: must be str, not int」は、整数型ではなく文字列(str)にしてくださいという表示です。人間は整数型の19と文字列(str)の"19"は同じように捉えられますが、Pythonに扱ってもらうためには区別する必要があります。

formatメソッドで文字列の中に文字列を埋め込む

formatメソッド を使うことで、文字列の中に文字列を埋め込むことができます。print関数と組み合わせて次のような使い方をすることが多いです。

{}(波括弧)を含んだ文字列の後に、.format(変数名)をつけて使います。

student_name = "Alice"
print("私の名前は{}です。".format(student_name))

実行すると「私の名前はAliceです。」と表示されます。このようにすれば、表示したい名前が変わった時にstudent_name = "Alice"student_name = "Bob"のように書き換えるだけで済みます。

2つ以上の文字列を埋め込むことも可能です。また、整数型や浮動小数点数型の数値もstr()による変換を行わずに埋め込めます。自動的に変換されるように作られているためです。

student_name = "Alice"
student_age = 19
print("私の名前は{}で、{}歳です。".format(student_name, student_age))

実行すると「私の名前はAliceで、19歳です。」と表示されます。

{}(波括弧)の中に数字を入れることで、埋め込む順番を変えることもできます。数字は1からではなく0からはじまります。

student_name = "Alice"
student_age = 19
print("私は{1}歳で、名前は{0}です。".format(student_name, student_age))

変数に代入されていても文字列であることには変わりませんから、format()メソッドが使えます。

weather_text = "今日の天気は{}です。"
weather_text = weather_text.format("晴れ")
print(weather_text)

実行すると「今日の天気は晴れです。」と表示されます。

{}(波括弧)の中には順番以外にも、:の後ろにいろいろなオプションを指定することができます。

書式指定文字列の文法 — Python 3.7.3 ドキュメント

例えば数値型に使える次のようなオプションがあります。正の値の場合は+を追加して表示し、負の値の場合は+を追加せずに表示します。

today_temperature = 3
tomorrow_temperature = -5
print("今日の最低気温は{:+}、明日の最低気温は{:+}です。".format(today_temperature, tomorrow_temperature))

実行すると「今日の最低気温は+3、明日の最低気温は-5です。」と表示されます。

浮動小数点数型に対して小数点以下何桁までを表示するかというオプションはよく使われます。小数点以下1桁までを表示する場合は次のように書きます。

today_temperature = 3.53
tomorrow_temperature = -5.27
print("今日の最低気温は{:.1f}、明日の最低気温は{:.1f}です。".format(today_temperature, tomorrow_temperature))

実行すると「今日の最低気温は3.5、明日の最低気温は-5.3です。」と表示されます。
順番の入れ替え機能と組み合わせることができますし、複数のオプションが同時に使えます。

today_temperature = 3.53
tomorrow_temperature = -5.27
print("明日の最低気温は{1:+.1f}、今日の最低気温は{0:+.1f}です。".format(today_temperature, tomorrow_temperature))

実行すると「明日の最低気温は-5.3、今日の最低気温は+3.5です。」と表示されます。

《メソッドとは?》

文字列は、その文字列自身に対していろいろな操作が行えるメソッドと呼ばれる機能を持っています。
整数型や浮動小数点数型も独自のメソッドを持っています。整数型や浮動小数点数型はformatメソッドは持っておらず、それぞれならではのメソッドがあります。
メソッドは関数に似ていますが、文字列など自身に対して働くという点で区別されます。
文字列が持つメソッドは、formatメソッドの他にもたくさんのものがあり、それは公式ドキュメントにまとめられています。

文字列メソッド — Python 3.7.3 ドキュメント

例えば一番上にはcapitalizeメソッドが説明されています。

最初の文字を大文字にし、残りを小文字にした文字列のコピーを返します。

試しに使ってみます。このメソッドは引数をとりません。

print("python".capitalize())

実行すると「Python」と表示されます。説明にある通り、最初の文字だけ大文字になります。

print関数の発展的利用法

formatメソッドを紹介しましたが、変数を表示したい時にprint関数を次のように使うこともあります。

student_age = 19
print("学生の年齢", student_age)

実行すると「学生の年齢 19」と表示されます。print関数は,で区切ることで、複数の文字列を並べて表示します。
並べて表示する際は間に半角スペースが入っておりますが、これを:に変えたいと思った場合は次のように書きます。sep=":"で、間に文字列:を入れるということを指示しています。

print("学生の年齢", student_age, sep=":")

実行すると「学生の年齢:19」と表示されます。もし間を詰めたい場合は、sep=""とすれば何も表示されません。

《どの書き方が良い?》

ここまで学んだ知識だけでも「学生の年齢19」の表示方法が3種類考えられます。

print("学生の年齢{}".format(student_age))
print("学生の年齢", student_age, sep="")
print("学生の年齢"+str(student_age))

プログラミングでは、このように同じことが複数の方法でできます。

この例では、見やすさの点でformatメソッドを使った書き方が好まれることが多いです。

どの書き方を選ぶかには次のような視点があります。

  • 見やすさ(可読性)
  • 速さ(処理速度)
  • 使用する記憶容量(メモリ)の少なさ
  • 拡張のしやすさ
  • 再利用のしやすさ

まずは見やすく書くということを意識しておくと良いでしょう。処理速度やメモリなどに関しては専門的な知識も必要ですが、見やすく書くことが、まずは始めやすいためです。もちろん、可読性も突き詰めると体系的な知識が求められてきます。

公式ドキュメントを見に行く

print関数の新しい使い方をしたので、ここで公式ドキュメントの組み込み関数のページにある説明を見に行ってみます。

print — Python 3.7.3 ドキュメント

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)とありますが、これはprint関数が受け取る 引数 の一覧を示しています。引数として、objects、sep、end、file、flushをとることが分かります。

これまで文字列を書くなどしていた部分がobjectsに相当します。*(アスタリスク)は、, で区切ることで複数の文字列を渡せることを示しています。(可変長位置引数 と呼びます)

=がついているsepやendなどは省略することができ、省略した場合はsepであれば半角スペースが渡されることになります。半角スペースから変更したい場合のみ、print("学生の年齢", student_age, sep=":")のように指定します。省略した場合に渡される値を デフォルト引数 と呼びます。

endのデフォルト引数\nは改行を示す特別な表現です。print関数は使用すると自動的に改行されていましたが、このデフォルト引数が設定されているためです。ここを変更することで、改行の変わりに文字を挟むことができます。

print("1", end=":")
print("2")

実行すると「1:2」と表示されます。

参考文献

はじめに — pep8-ja 1.0 ドキュメント

テキストシーケンス型 — Python 3.7.3 ドキュメント

ダイビックのことをもっと知ってみませんか?