SBクリエイティブ

正誤情報

『Python[完全]入門』正誤情報

2021.03.01
対象書籍
Python[完全]入門

初版第7刷
※Chapter15にて、cgiモジュールが廃止予定のため、cgiモジュールを使わないように、解説ならびにサンプルを変更しています。

■p.543
Pythonの標準ライブラリには、CGIプログラムを開発するための、cgiモジュールが用意されています。

ここではPythonの標準ライブラリを使って、CGIプログラムを作成する方法を紹介します。

■p.544
フォームを受け取るには、まずcgiモジュールのFieldStorage(フィールド・ストレージ)オブジェクトを生成します。以下では、このオブジェクトを代入した変数を「フォーム」と表記しています。

フォームを取得するには、sysモジュールとosモジュールを使って標準入力からテキストを読み込み、urllib.parseモジュールを使って解析します。以下で「フォーム」と表記した変数には、フォームの入力内容をまとめた辞書が代入されます。

■p.544
フォームの生成
フォーム = cgi.FieldStorage()

フォームの取得
テキスト = sys.stdin.read(int(os.environ[‘CONTENT_LENGTH’]))
フォーム = urllib.parse.parse_qs(テキスト)

■p.544
フォームに入力された内容は、inputタグのname属性で指定されたパラメータ名で受け取ることができます。

フォームの各欄に入力された内容は、inputタグのname属性が表すパラメータ名を使って取得できます。

■p.544
フォームの入力内容を受け取るには、次のようなgetfirst(ゲット・ファースト)メソッドを使います。

フォームの各欄は次のように取得できます。各欄の入力内容はリストになっていますが、以下では先頭の要素だけを取得しています。

■p.544
フォームの入力内容を受け取る(getfirstメソッド)
フォーム.getfirst(パラメータ名)

フォームの各欄を取得
フォーム[パラメータ名][0]

■p.544-545, login.py
import cgi
import codecs
import sqlite3
import sys

import codecs
import os
import sqlite3
import sys
import urllib.parse

■p.545, login.py
form = cgi.FieldStorage() ← パラメータ
user = form.getfirst(‘user’) ← ユーザ名
password = form.getfirst(‘password’) ← パスワード

text = sys.stdin.read(int(os.environ[‘CONTENT_LENGTH’])) ← 標準入力
form = urllib.parse.parse_qs(text) ← フォーム
user = form[‘user’][0] ← ユーザ名
password = form[‘password’][0] ← パスワード

初版第6刷
※Gmailの使用変更に伴い、原稿ならびにサンプルを更新しております。

■p.466
▼変更前
ここで紹介するプログラム例では、Gmail(Googleのメールサービス)を使います。Gmailのアカウントを作成する方法については、Gmailのドキュメントなどをご確認ください。SMTPサーバを利用するためには、次のような設定が必要です。
[1] Gmailの設定において「すべての設定を表示」→「メール転送とPOP/IMAP」→「IMAPアクセス」を「IMAPを有効にする」に設定します。
[2] Googleアカウントの設定において、「セキュリティ」→「安全性の低いアプリのアクセス」を「オン」に設定します。この設定はGoogleでは非推奨となっていますが、簡単な方法でSMTPサーバを利用するために、今回のプログラム例では必要です。

▼変更後
ここで紹介するプログラム例は色々なメールサービスに対応していますが、実行例にはGmail(Googleのメールサービス)を使いました。GmailでSMTPサーバを利用するには、次のような設定が必要です。
[1] 「Googleアカウントの管理」の「セキュリティ」を開き、「2段階認証プロセス」を「オン」に設定します。
[2] 同じ画面で「アプリ パスワード」を選択します。「アプリを選択」は「その他(名前を入力)」とし、適当な名前(例えば「python_smtp」)を入力して、アプリパスワードを生成します。生成されたアプリパスワードは、後で使うのでメモしておいてください。

■p.467
▼変更前
メールを送信するためには、smtplib(エスエムティーピー・リブ)モジュールのSMTPクラスを使います。Gmailの場合には、次のようなプログラムを書きます。サーバには’smtp.gmail.com’を、ポート番号には587を指定します。ログイン名は送信元のメールアドレスと同じです。なお、以下は本書の執筆時点で動作を確認しましたが、Gmailの仕様が変更された場合、プログラムの変更が必要になる可能性があります。

メールの送信
with smtplib.SMTP(サーバ, ポート番号) as smtp:
  smtp.ehlo()
  smtp.starttls()
  smtp.ehlo()
  smtp.login(ログイン名, パスワード)
  smtp.sendmail(送信元, 送信先, メール.as_string())

▼変更後
メールを送信するには、smtplib(エスエムティーピー・リブ)モジュールのSMTPクラスを使って、次のようなプログラムを書きます。お使いのメールサービスにおけるサーバ、ログイン名、パスワードを指定し、ポート番号には587を指定してください。Gmailの場合、サーバには’smtp.gmail.com’を、ログイン名には送信元のメールアドレス’…@gmail.com’を、パスワードには前述のアプリパスワードを指定します。

メールの送信
with smtplib.SMTP(サーバ, ポート番号) as smtp:
  smtp.ehlo()
  try:
    smtp.starttls()
    smtp.ehlo()
  except smtplib.SMTPNotSupportedError:
    pass
  smtp.login(ログイン名, パスワード)
  smtp.sendmail(送信元, 送信先, メール.as_string())

■p.468
▼変更前
また、上記で呼び出しているSMTPクラスの各メソッドは、次のような動作をします。なお、送信元や送信先はメールのヘッダにも設定しますが、sendmail(センド・メール)メソッドは引数で指定された送信元や送信先を使ってメールを送信します。

▼変更後
また、上記で使っているSMTPクラスの各メソッドは、次のように動作します。送信元や送信先はメールのヘッダにも設定しますが、sendmail(センド・メール)メソッドは、引数で指定された送信元や送信先を使ってメールを送信します。

■p.468
▼変更前
SMTPのEHLOコマンドを利用してクライアント名をサーバに伝える

▼変更後
SMTPのEHLOコマンドを利用して、クライアント名をサーバに伝える

■p.468
▼変更前
以下のプログラム例において、送信元、送信先、パスワードは、ご自分がお使いのものに書き換えてから実行してください。

▼変更後
以下のプログラム例において、サーバ、送信元、送信先、パスワードは、ご自分がお使いのものに書き換えてから実行してください。

■p.468,  mail1.py
▼変更前
FROM = ‘送信元メールアドレス’ ← 送信元

▼変更後
SERVER = ‘SMTPサーバ’ ← サーバ
FROM = ‘送信元メールアドレス’ ← 送信元

■p.468 mail1.py
▼変更前
with smtplib.SMTP(‘smtp.gmail.com’, 587) as smtp: ← SMTPオブジェクト
  smtp.ehlo() ← EHLOコマンド
  smtp.starttls() ← TLSで接続
  smtp.ehlo() ← EHLOコマンド
  smtp.login(FROM, PASS) ← ログイン
  smtp.sendmail(FROM, TO, mail.as_string()) ← メールを送信

▼変更後
with smtplib.SMTP(SERVER, 587) as smtp: ← SMTPオブジェクト
  smtp.ehlo() ← EHLOコマンド
  try: ← TLSの接続を試みる
    smtp.starttls() ← TLSの接続を開始
    smtp.ehlo() ← EHLOコマンド
  except smtplib.SMTPNotSupportedError: ← TLSの接続に失敗
    pass ← TLSは使わずに続行
  smtp.login(FROM, PASS) ← ログイン
  smtp.sendmail(FROM, TO, mail.as_string()) ← メールを送信

■p.469
▼変更前
プログラムを実行し、エラーが発生せずに終了したら、Gmailを使って受信したメールを確認してください。以下のようなメールが届いていたら成功です。

▼変更後
プログラムを実行し、エラーが発生せずに終了したら、受信したメールを確認してください。以下のようなメールが届いていたら成功です。

■p.469
▼変更前
そして上記のプログラムと同様に、自分自身にメールを送信してください。送信元、送信先、パスワードは、ご自分がお使いのものに書き換えてから実行してください。

▼変更後
そして上記のプログラムと同様に、自分自身にメールを送信します。サーバ、送信元、送信先、パスワードは、ご自分がお使いのものに書き換えてから実行してください。

■p.469 mail2.py
▼変更前
FROM = ‘送信元メールアドレス’ ← 送信元

▼変更後
SERVER = ‘SMTPサーバ’ ← サーバ
FROM = ‘送信元メールアドレス’ ← 送信元

■p.469 mail2.py
▼変更前
with smtplib.SMTP(‘smtp.gmail.com’, 587) as smtp: ← SMTPオブジェクト
  smtp.ehlo() ← EHLOコマンド
  smtp.starttls() ← TLSで接続
  smtp.ehlo() ← EHLOコマンド
  smtp.login(FROM, PASS) ← ログイン
  smtp.sendmail(FROM, TO, mail.as_string()) ← メールを送信

▼変更後
with smtplib.SMTP(SERVER, 587) as smtp: ← SMTPオブジェクト
  smtp.ehlo() ← EHLOコマンド
  try: ← TLSの接続を試みる
    smtp.starttls() ← TLSの接続を開始
    smtp.ehlo() ← EHLOコマンド
  except smtplib.SMTPNotSupportedError: ← TLSの接続に失敗
    pass ← TLSは使わずに続行
  smtp.login(FROM, PASS) ← ログイン
  smtp.sendmail(FROM, TO, mail.as_string()) ← メールを送信

■p.470
▼変更前
プログラムを実行し、エラーが発生せずに終了したら、Gmailで受信したメールを確認してください。以下のようなメールが届いていたら成功です。

▼変更後
プログラムを実行し、エラーが発生せずに終了したら、受信したメールを確認してください。以下のようなメールが届いていたら成功です。

■p.470
▼変更前
メール送信のテストが終了して、もしプログラムからメールを送信する必要が当面なければ、GmailやGoogleアカウントの設定を元に戻しておくことをおすすめします。Gmailの設定において「IMAPアクセス」を無効にし、Googleアカウントの設定において「安全性の低いアプリのアクセス」をオフにします。

▼変更後
※削除

■p.511
▼変更前
URLは任意ですが、以下のプログラム例では著者のWebサイト(http://higpen.jellybean.jp/)を指定しました。

▼変更後
URLは任意ですが、以下のプログラム例では著者のWebサイト(https://higpen.jellybean.jp/)を指定しました。

■p.511
▼変更前
with urlopen(‘http://higpen.jellybean.jp/’) as file:

▼変更後
with urlopen(‘https://higpen.jellybean.jp/’) as file:

■p.512
▼変更前
with urlopen(‘http://higpen.jellybean.jp/’) as file:

▼変更後
with urlopen(‘https://higpen.jellybean.jp/’) as file:

■p.513
▼変更前
with urlopen(‘http://higpen.jellybean.jp/’) as web_file:

▼変更後
with urlopen(‘https://higpen.jellybean.jp/’) as web_file:

■p.514
▼変更前
プログラム例では著者のWebサイト(http://higpen.jellybean.jp/)を指定しましたが、他のURLを指定しても構いません。

▼変更後
プログラム例では著者のWebサイト(https://higpen.jellybean.jp/)を指定しましたが、他のURLを指定しても構いません。

■p.515
▼変更前
r = requests.get(‘http://higpen.jellybean.jp/’)

▼変更後
r = requests.get(‘https://higpen.jellybean.jp/’)

■p.516
▼変更前
r = requests.get(‘http://higpen.jellybean.jp/’)

▼変更後
r = requests.get(‘https://higpen.jellybean.jp/’)

初版第3冊

p.234, 灰色の枠(上), 1行目
修正前:Python …
修正後:python …

p.263, varargs4.py, 2行目
修正前:for i, x in enumerate(t, start=1):
修正後:for i, x in enumerate(t, 1):

p.264, only8.py, 2行目
修正前:for i, x in enumerate(t, 1):
修正後for i, x in enumerate(t, start):

p.264, only8.py, 4行目
修正前:for i, (k, v) in enumerate(d.items(), len(t)+1):
修正後:for i, (k, v) in enumerate(d.items(), len(t)+start):

p.296
修正前:Food(商品)
修正後:Food(食品)

P.299, 下から4行目
修正前:FoodオブジェクトやItemオブジェクトからオーバーライド
修正後:FoodオブジェクトやToyオブジェクトから、オーバーライド

P.303, 下から3行目
修正前:FoodクラスとItemクラスに
修正後:FoodクラスとToyクラスに

p.361
修正前:ウォルスラ
修正後:ウォルラス

p.456, excel2.py
修正前:book = openpyxl.load_workbook()
修正後:book = openpyxl.Workbook()

p.544
修正前:
冒頭の「sys.stdout…」という記述は、標準出力の文字エンコーディングを調整し、文字化けを防ぐための処理です。
修正後:
冒頭の「#!/usr/bin…」は、macOSやLinuxでCGIプログラムを実行する場合に必要な、シバン(シェバン)と呼ばれる記述です。シバンはファイルを実行するためのインタプリタを指定するための機能で、ここではPythonインタプリタ(python3)を指定しています。また、import文の後にある「sys.stdout…」という記述は、標準出力の文字エンコーディングを調整し、文字化けを防ぐための処理です。

p.544, login.py, 1行目
修正前:
import cgi
修正後:
#!/usr/bin/env python3
import cgi

p.545
修正前:
(shop.db)も必要です。
修正後:
(shop.db)も必要です。
なおmacOSやLinuxの場合は、login.pyの属性を実行可能に設定しておく必要があります。cgi-binディレクトリにおいて、ターミナルから「chmod 755 login.py」または「chmod 700 login.py」を実行しておいてください。

 

初版第2刷

■p.552
修正前
if file:                  ← 選択済みの場合
  file.save(‘uploaded’, overwrite=True)  ← ファイルを保存

修正後
if file:                  ← 選択済みの場合
  os.makedirs(‘uploaded’, exist_ok=True) ← ディレクトリを作成
  file.save(‘uploaded’, overwrite=True)   ← ファイルを保存

修正前
return bottle.static_file(file)

修正後
return bottle.static_file(file, root=’.’)

修正前
以下のようにプログラム(bottle2.py)とディレクトリ(uploaded)を配置してください。

修正前
プログラム(bottle2.py)とディレクトリ(uploaded)の配置は以下の通りです。uploadedディレクトリがない場合には、プログラムが自動的に作成します。

この記事をシェアする