ばぁど・うぉっちんぐ

セキュリティを頑張りたいプログラマ。自由と春を求めて羽ばたく渡り鳥。

このブログはGoogle Analyticsを利用しています

OTPを設定したGitHubにPythonでアクセスする時のメモ

サイバーセキュリティプログラミング-Pythonで学ぶハッカーの思考- で勉強をしていたお話。

www.oreilly.co.jp

第7章のサンプルコードの通り、GitHubPythonからいじれるようにしたい。

しかしセキュリティの観点からGitHubにOTP認証を設定しており、単純にログインをすることができなかった。

github3.exceptions.AuthenticationFailed: 401 Must specify two-factor authentication OTP code.

使用したライブラリ

PythonからGitHubを操作できるようにするライブラリ。 github3py.readthedocs.io

今回は、上記のlogin関数を用いる。

github3py.readthedocs.io

[USAGE]
github3.login(username=None, password=None, token=None, two_factor_callback=None)


[Parameters]
username (str) – login name
password (str) – password for the login
token (str) – OAuth token
two_factor_callback (func) – (optional), function you implement to provide the Two Factor Authentication code to GitHub when necessary

[Returns]
GitHub

解決策

login()の引数にもあるようにtwo_factor_callbackを利用する。

github3py.readthedocs.io

具体的にはtwo_factor_callbackで多要素認証を設定している場合、呼び出すような関数を実装しておく必要がある。

上記のサンプルコードを参考にすると下記のような感じ。 ※ところどころ編集

import github3

prompt = input

def my_two_factor_function():
    code = ''
    while not code:
        code = prompt('Enter 2FA code\n')
    return code

g = github3.login('ultrabirdtech', 'my_password',
                  two_factor_callback=my_two_factor_function)

上記を実装したところ、callback関数が呼ばれ、input()の入力要求でOTPを入力することで認証の処理に進めるようになった。

# python git_trojan.py 
Enter 2FA code
XXXXXX   # X はワンタイムパスワード
OTP Auth Succsess!!

単純にcallbackを使えばいいというお話。 あまり日本語での解決記事なかったため備忘録として残しておきます。

まとめ

  1. 多要素認証を設定していても問題なくpythonからGItHubを操作できる
  2. callback関数を使用する

特段、難しい解決方法ではなかった印象。 公式ドキュメントをしっかり読みましょう。

おまけ

実装中にログイン失敗しすぎると、一定期間ログインできなくなります。 感覚的には割と早くアカウントロック時間は短かった印象です。

まぁ、アカウントロック機能があるのは当たり前っちゃ当たり前。

github3.exceptions.ForbiddenError: 403 Maximum number of login attempts exceeded. Please try again later.

おまけ2 (5/19 16:45追記)

結局、githubにアクセスするごとにOTP入力が必要なクソアプリが完成したとのことです。

サンプルコードの出力結果(期待値)

[*] Found file abc.json
[*] Attempting to retrieve dirlister
[*] Attempting to retrieve environment
[*] In dirlister module.
[*] In environment module.

実際の出力結果

Enter 2FA code
XXXXXX
OTP Auth Succsess!!
Enter 2FA code
XXXXXX
Enter 2FA code
XXXXXX
[*] Found file abc.json
Enter 2FA code
XXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

[*] Attempting to retrieve dirlister
Enter 2FA code
XXXXXX
OTP Auth Succsess!!
Enter 2FA code
XXXXXX
[*] Attempting to retrieve environment
Enter 2FA code
XXXXXX
OTP Auth Succsess!!
Enter 2FA code
XXXXXX
[*] In dirlister module.
Enter 2FA code
XXXXXX
OTP Auth Succsess!!
Enter 2FA code
[*] In environment module.
XXXXXX
Enter 2FA code
XXXXXX
OTP Auth Succsess!!
Enter 2FA code
XXXXXX

【個人勉強メモ】短期記憶と長期記憶

大学時代に教員免許を取得するための勉強をしていた。

現在の仕事が講師業なので、GWに実家に帰ったタイミングで教育心理学の本を持って帰ってきたがこれがなかなか面白い。

今の仕事に結びつく内容だったので、少しずつ勉強メモとしてアウトプットしていく。

記憶力

人が知識として記憶をする際、記憶のタイプは2つある。

短期記憶と長期記憶だ。

短期記憶とは、電話帳の電話番号を一時的に覚えて電話のダイヤルを回す際に使うものだ。電話をかけたあとは電話番号は大抵の場合忘れます。

長期記憶とは、短期記憶とは違い長期的に覚えておくことができる知識。

短期記憶

上記の通り短期記憶とは一時的な記憶である。 10数秒で消失してしまうような短い時間間隔での記憶で、わずかな量しか記憶ができません。

電話番号とか黒板の文書をノートに書き写すとか、講義者の講義をメモするとかいう際に使われる記憶領域。

この短期記憶を使い際のテクニックとしてはまとまりを意識すること。 例えばIPアドレスIPアドレス127.0.0.1と言った具合に数字が.によって一定のまとまりとして区切られている。 こうすることで、127001という単なる数値の羅列より覚えやすくなっている。

ローカルホスト(127.0.0.1)はわかりやすいかもしれないが192.168.XXX.XXXのようなIPアドレスを覚える際は.の存在がより重要になるだろう。

長期記憶

長期記憶は短期記憶に比べて無限の容量と考えられている。

例えばアメリカの首都はどこか?などの長期的に記憶されているものだ。

新しい情報はまず短期記憶にはいり、その多くは忘れ去られますが、一部は長期記憶に転送され定着します。

短期記憶から長期記憶へ

短期記憶から長期記憶にするために必要なことは主に2つ。

1. 繰り返し行う

反復練習のことだ。専門用語ではリハーサルという。

学生時代などの試験勉強の前などに英単語や四字熟語などを繰り返し勉強して、反復練習を行った記憶は誰にでもあるだろう。

また具体例としては積み木自己紹介と言ったアイスブレイキングなどで活用されている。

mynavi-agent.jp

積み木式自己紹介とは、初対面のグループが採用するアイスブレイキングである。 詳しくは上記のリンクを参照してほしいのだが、このアイスブレイキングはまさに反復を行うものであり、会議の時に全員の名前を把握しなければいけないという課題をクリアできる。

2. 意味付けを行う

例えばセキュリティ界隈ではIDSIPSというツールがある。

IDSIPSともにネットワーク上の通信を監視し、不審な通信があれば何かしらのアクションを行う。

IDSは不審な通信があれば検知し管理者に通知を行う。 IPSIDSの機能に加えて不審な通信の遮断を行なってくれる。

このように真ん中のアルファベットのみが違うので初心者はこのIDSIPSの違いがわかりづらく、内容をごちゃ混ぜにしてしまうことが多々見受けられる。

そこで意識することが言葉の意味付けである。アルファベットは何かしらの頭文字を意味している。 IDSIntrusion Detection Systemのことであり、真ん中のDetectionという単語は検知という意味を持っている英単語だ。

対してIPSIntrusion prevention Systemのことであり、prevention(防止)という単語が使われIPSの機能を表現できる英単語であることがわかるだろう。

このようにIDSIPSを単なるアルファベットの羅列として覚えるのではなく、アルファベットの意味付けを行うことで記憶し、かつ長期的に脳内に情報をインプットすることができるだろう。

忘却

記憶においてもう一つ重要な要素が忘却だ。

人は忘れる生き物である。

忘却曲線というものが存在する。 ja.wikipedia.org

この曲線を見ると最初の1時間でガクッと下がるが、その後の数時間は緩やかな下降になる。 この緩やかに下降しているうちに繰り返し勉強することで、物事を忘れずに記憶することができるようになるだろう。

また、忘却の一つの要素として重要なものが干渉だ。

以前学習した内容のために新しい学習材料の記憶が妨害されることを順行干渉、すでに学習していたことの記憶が妨害されることを逆行干渉と呼ぶ。

干渉説を裏付けるものとして、学習後睡眠をとることで記憶が定着しやすいというものがある。これは、学習後に起きていると学習したことと関係のない余計な情報が入ってくるため干渉が起こり、忘れてしまうからだと考えられているそうです。

まとめ

講師業をしているため、久々に教育心理学を学んで面白いことを学んでいたんだなと実感している。

講義の資料作りなどに積極的に生かしていきたい。

講義の際も、セキュリティの単語の繰り返しのインプットや復習しやすいように家に持ち帰ることができる資料などを作るようにしたい。

情報処理安全確保支援士のオンライン講習Bを受講してみた話

情報処理安全確保支援士になって2年目の春が来ました。

4月登録者の講習が始まる時期ですね。

というわけで、今年は2年目になるので講習Bを受けました。講習Bの軽いまとめと感想です。

講習Aの感想はこちら(1年前のブログです) ultrabirdtech.hatenablog.com

講習Bの学習内容

2019年度春季のものは下記のようなものが学習内容にありました。

www.ipa.go.jp

上記サイトより引用 f:id:UltraBirdTech:20190506203510p:plain

講習Bなので技能の教科がテーマとなっております。

セキュリティ設定共通化手順SCAP解説【前・後編】

SCAPとは情報セキュリティ対策の自動化標準化を目指した「セキュリティ設定共通化手順」のこと。

要素として下記のようなものがある。

カテゴリ 名前 概要
脆弱性管理 CVE プログラム自身に内在するセキュリティ問題に一意の番号を付与
CVSS 脆弱性自体の特性、パッチの提供状況、ユーザー環境での影響度などを考慮し影響度を評価するもの
資産管理 CPE 情報システムを構築するハードウェア、ソフトウェアに一意の名称を付与する
構成管理 OVAL プログラム上のセキュリティ問題や設定上の問題をチェックするための使用
CCE プログラムが稼働するための設定上の問題に一意の番号を付与する
XCCDF セキュリティチェックリストやベンチマークなどの文書を記述するための仕様

CVE、CVSSは以前ハニーポットを運用しているときに、取得した脆弱性情報をもとに調査していたことはあったので知っていた。 ultrabirdtech.hatenablog.com

他のOVALXCCDF などは初見でした。

ユーザ教育と内部監査

内部監査は学生時代にISO14000の内部監査員資格持っているので感覚はつかめていた。

監査に関する基準とか証拠、監査人を務める時はどういう特性があるべきかなどがテーマになっていた。

法律遵守・契約履行

個人的に一番嬉しかった学習テーマ。

最近coinhive事件とかアラートループ事件とかでセキュリティ関連の法律は気になっていたので勉強になった。

サイバーセキュリティに関する法律や履行される契約についてわかりやすくまとめてもらえていたのでとてもありがたかったです。

サイバーセキュリティ基本法からウイルス作成罪、作業の請負、委託、派遣の違いなどにも触れらていました。

個人的に気になったセキュリティ関連の法律は下記でまとめました。 ultrabirdtech.hatenablog.com

まだまだセキュリティに関する法律は勉強続けたいと考えております。

感想

講習Bを受けてみて、難易度とともに有用度とかも個人的には上がった気がしました。

特にSCAPに関しては新しく学び直しを行わなければいけない分野だったので、スキル4レベルの維持には貢献できているかなと思います。

あとやはり法律、契約に関する部分がとても有用に感じました。

来年の講習Cと集合研修が楽しみです。

【個人向けメモ】情報セキュリティ関連の法律などを調べてみた

情報処理安全確保支援士になって1年。セキュリティエンジニアになって半年。

色々とセキュリティに関する法律に興味を持ったので、このタイミングで一度まとめてみようと思いました。

最近coinhive とか無限アラート事件とかで逮捕・補導、書類送検されている事態に発展しているので自衛のための法律の勉強です。

サイバーセキュリティ基本法

2014年11月成立、2015年1月施行。

サイバーセキュリティという単語を定義。

また国や地方自治体における取り組みを明文化。

elaws.e-gov.go.jp

個人的に関わりがあるのが下記の部分。

第七条 サイバー関連事業者(インターネットその他の高度情報通信ネットワークの整備、情報通信技術の活用又はサイバーセキュリティに関する事業を行う者をいう。以下同じ。)その他の事業者は、基本理念にのっとり、その事業活動に関し、自主的かつ積極的にサイバーセキュリティの確保に努めるとともに、国又は地方公共団体が実施するサイバーセキュリティに関する施策に協力するよう努めるものとする。

今のお仕事がサイバーセキュリティ関連なので、事業者としての役割は上記のように明記されている。

情報処理の促進に関する法律

2016年4月改正、2016年10月施行。

情報処理安全確保支援士の業務や資格についてなどが記載されている。

elaws.e-gov.go.jp

基本的に情報処理安全確保支援士はサイバーセキュリティ基本法の第2条に書かれていることを支援する。

第六条 情報処理安全確保支援士は、情報処理安全確保支援士の名称を用いて、事業者その他の電子計算機を利用する者によるサイバーセキュリティ(サイバーセキュリティ基本法(平成二十六年法律第百四号)第二条に規定するサイバーセキュリティをいう。以下同じ。)の確保のための取組に関し、サイバーセキュリティに関する相談に応じ、必要な情報の提供及び助言を行うとともに、必要に応じその取組の実施の状況についての調査、分析及び評価を行い、その結果に基づき指導及び助言を行うことその他事業者その他の電子計算機を利用する者のサイバーセキュリティの確保を支援することを業とする。 (情報処理安全確保支援士の資格)

サイバーセキュリティ基本法の該当部分。

第二条 この法律において「サイバーセキュリティ」とは、電子的方式、磁気的方式その他人の知覚によっては認識することができない方式(以下この条において「電磁的方式」という。)により記録され、又は発信され、伝送され、若しくは受信される情報の漏えい、滅失又は毀損の防止その他の当該情報の安全管理のために必要な措置並びに情報システム及び情報通信ネットワークの安全性及び信頼性の確保のために必要な措置(情報通信ネットワーク又は電磁的方式で作られた記録に係る記録媒体(以下「電磁的記録媒体」という。)を通じた電子計算機に対する不正な活動による被害の防止のために必要な措置を含む。)が講じられ、その状態が適切に維持管理されていることをいう。 (基本理念)

不正指令電磁記録に関する罪(ウイルス作成罪)

elaws.e-gov.go.jp

刑法の中に書かれているみたいですね。

最近何かと話題の法律。個人的に一番ビビってる法律です。

coinhiveとか無限ループ事件とかね。

第百六十八条の二 正当な理由がないのに、人の電子計算機における実行の用に供する目的で、次に掲げる電磁的記録その他の記録を作成し、又は提供した者は、三年以下の懲役又は五十万円以下の罰金に処する。 一 人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせるべき不正な指令を与える電磁的記録 二 前号に掲げるもののほか、同号の不正な指令を記述した電磁的記録その他の記録 2 正当な理由がないのに、前項第一号に掲げる電磁的記録を人の電子計算機における実行の用に供した者も、同項と同様とする。 3 前項の罪の未遂は、罰する。 (不正指令電磁的記録取得等)

不正アクセス禁止法

elaws.e-gov.go.jp

他者が運用しているサーバーに勝手に侵入してはいけないよ、という法律。

案外大丈夫だと思われがちですが、パスワードを推測してログインを突破したりだとか、脆弱性を突いてWebページ攻撃していたらWebサーバーに入れてしまったりすると問われてしまう。

不正アクセスの定義は下記。

この法律において「不正アクセス行為」とは、次の各号のいずれかに該当する行為をいう。一 アクセス制御機能を有する特定電子計算機に電気通信回線を通じて当該アクセス制御機能に係る他人の識別符号を入力して当該特定電子計算機を作動させ、当該アクセス制御機能により制限されている特定利用をし得る状態にさせる行為(当該アクセス制御機能を付加したアクセス管理者がするもの及び当該アクセス管理者又は当該識別符号に係る利用権者の承諾を得てするものを除く。) 二 アクセス制御機能を有する特定電子計算機に電気通信回線を通じて当該アクセス制御機能による特定利用の制限を免れることができる情報(識別符号であるものを除く。)又は指令を入力して当該特定電子計算機を作動させ、その制限されている特定利用をし得る状態にさせる行為(当該アクセス制御機能を付加したアクセス管理者がするもの及び当該アクセス管理者の承諾を得てするものを除く。次号において同じ。) 三 電気通信回線を介して接続された他の特定電子計算機が有するアクセス制御機能によりその特定利用を制限されている特定電子計算機に電気通信回線を通じてその制限を免れることができる情報又は指令を入力して当該特定電子計算機を作動させ、その制限されている特定利用をし得る状態にさせる行為

不正競争防止法

elaws.e-gov.go.jp

実際の実例では、退職間際に自社の顧客リストとか商品の機密情報などの営業秘密を持ち出すとかが当たりますかね。

窃取、詐欺、強迫その他の不正の手段により営業秘密を取得する行為(以下「不正取得行為」という。)又は不正取得行為により取得した営業秘密を使用し、若しくは開示する行為(秘密を保持しつつ特定の者に示すことを含む。以下同じ。)

営業秘密

6 この法律において「営業秘密」とは、秘密として管理されている生産方法、販売方法その他の事業活動に有用な技術上又は営業上の情報であって、公然と知られていないものをいう。

秘密管理性有用性非公知性の3つの性質が存在する。

営業秘密はこの3要素が重要になる。

ここは2019年度春季の情報処理安全確保支援士の午後2で出てきましたね。

まとめ

法律むずい。

サイバーセキュリティ関連だと法律とか絡んでくるので、自分の身を守るためにも最低限の勉強はしておきたいです。

【10日目】Python勉強メモ -まとめ-

無事にGW企画、完遂しました。

まぁ基礎しかやっていないので、入門書読んで書かれてあることをアウトプットしているだけなんですけどね。

GW投稿した記事

日にち タイトル
1日目 Python勉強メモ -はじめの一歩- - ばぁど・うぉっちんぐ
2日目 【2日目】Python勉強メモ -データ型- - ばぁど・うぉっちんぐ
3日目 【3日目】Python勉強メモ - リスト、辞書 - - ばぁど・うぉっちんぐ
4日目 【4日目】Python勉強メモ -制御構文- - ばぁど・うぉっちんぐ
5日目 【5日目】Python勉強メモ-関数・例外処理- - ばぁど・うぉっちんぐ
6日目 【6日目】Python勉強メモ -モジュールのimport- - ばぁど・うぉっちんぐ
7日目 【7日目】Python勉強メモ -オブジェクトとクラス- - ばぁど・うぉっちんぐ
8日目 【8日目】Python勉強メモ -ファイルへの入出力- - ばぁど・うぉっちんぐ
9日目 【9日目】Python勉強メモ - Webへの扉 - - ばぁど・うぉっちんぐ

Python触ってみた感想

基本的に文法は僕好みです。

個人的に一番の得意言語はRubyなので、そのRubyと似通った文法なのがいいところだと思います。

あと重ね重ねなのですが;が行の終わりにいらないのが嬉しい。

今後の展望

課題解決スクリプトの作成

Pythonを用いての諸問題を解決できる簡易スクリプトを開発していきたいと思っています。

主に下記の本を参考にしながらですね。

www.oreilly.co.jp

django

9日目に触れたPythonのWebフレームワークであるdjangoはいつか触れてみたいと思っています。 次の土日あたりにでもチュートリアルやってみようかしら。

まとめ

一通りPythonの文法とかは学ぶことができたと思っています。

あとはもう少しPythonでの実装をしてみて、細かい書き方を覚えないとな。

【9日目】Python勉強メモ - Webへの扉 -

Python 勉強メモ9日目。

セキュリティ界隈で働いていく以上、Webとは切っても切れない関係です。

というわけで、PythonでWeb界隈への扉を叩いてみようと思います。

前回はこちら ultrabirdtech.hatenablog.com

Webの基本知識

HTTP(Hypertext Transfer Protocol)

Webクライアントとサーバー間でリクエストとレスポンスをやり取りするための仕様(プロトコル)

HTML(Hypertext Markup Language)

Webページを作成するためのMarkup Language。 下記のようにタグで要素を指定する。

<html>
<head>something write...</head>
<body>something write...</body>
</html>

URL(Uniform Resource Locator)

サーバー上のリソースを一意に特定するための識別子。

http://example.jp などがURLになる。

フレームワーク

Webアプリケーションの作成を支援してくれる便利ツール。 Pythonではdjangoというフレームワークが有名。

www.djangoproject.com

Webアプリケーションで必要な実装である、URLと対応ファイルとのルーティングやDBとのデータのやり取り(ORM)などを簡易化し、ルールとして統一してくれている。 他にもテンプレートとしてHTMLにどのようにデータを反映させるか、紐付けるかだったりや認証・権限の管理、セッションの管理などを担当してくれている。

Webサーバーを立ててみる

Pythonは基本的にはサーバーサイドを担当する言語である。 下記のコマンドを打つと単純なWebサーバーを実行できる。

$ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Ctrl + Cで止めることが可能。

上記コマンドを実行したフォルダ内にhtmlファイルを用意しておけば中身を閲覧することが可能になる。

下記のファイルをindex.htmlとして保存すればhttp://0.0.0.0:8000に繋いだ時点でWebページとして表示がされる。(index.htmlというものがあれば、フォルダにアクセスした時にデフォルトでindex.htmlが表示される)

<html>
    <head>
      <title>SAMPLE</title>
    </head>
    <body>
      <h1>SAMPLE PAGE</h1>
      <p>Stop Command is 'Ctrl + C'.</p>
    </body>
</html>

Let's Try

課題1. Webサーバーを構築して通信をしてみよう

課題2. Web上のAPIを叩いて情報を取得してみよう

Web上のAPIを利用して情報を取得してみよう。

仕様

  • virus total を用いてファイルがマルウェアかどうかを判断するスクリプトを書いてください
  • エラー処理などは適時行なってください
  • virus totalから返却されたレスポンスは分かりやすく整形してください(ファイルへの出力、print()で出力など)

ヒント1. virus total

virus total とはファイルやファイルのハッシュ値で問い合わせをすることで、マルウェアがどうかを判別してくれるWebサービスマルウェアかどうかを判断する仕組みとしては、各セキュリティベンダーがマルウェアの情報を保持しており、それらの情報と付き合わせてマルウェアかどうかを判断してくれている。

www.virustotal.com

f:id:UltraBirdTech:20190503111928p:plain

ヒント2. 使用するライブラリ

PythonでHTTPリクエストを行う時に必要なライブラリ。

import urllib.request
import urllib.error
import urllib.parse

などを用いてください。

virust totalから返却されたレスポンスを解析する時にjsonを使う場合がある。

import json

まとめ

Webはもう少し詳しくやりたい。

djangoいじってみたいお気持ちはある。

【8日目】Python勉強メモ -ファイルへの入出力-

Pythonでプログラムをしていると、ファイルから情報を読み取ったり、アウトプットとしてテキストファイルに記述する場合がある。

本日はPythonによるファイルへの入出力のお話。

前回はこちら ultrabirdtech.hatenablog.com

ファイルを開く

ファイルを読み書きする場合は、最初にファイルをopenする必要がある。

fileobject = open(filename, mode)

filenameには今回操作対象になるファイル名を指定する。 modeには操作の種類を指定する。

modeには2文字まで指定可能である。 1文字目は操作を意味している。

操作の種類 意味
r 読み出し。
w 書きこみ。ファイルが存在しない場合新規作成、存在する場合は上書き。
x 書き込み。ファイルがまだ存在しないときのみ機能する。上書きによるファイルの損失を防ぐことが可能。
z ファイルが存在する場合は、追記(現在の末尾の後ろへの書き込み)。

2字目はファイルのタイプ。 2字目は指定しないことも可能で、その際はテキスト形式という意味になる。

ファイルのタイプ 意味
t テキスト
b バイト
(なし) テキスト

開いたファイルは閉じる必要がある。 一連のファイルの読み込み、書き込みなどの処理が終わったらファイルをclose()する。

fileobject.close()

※後ほどwithも説明します。

ファイルへの書き込み

write()を使用する。

下記ソースコードfile_write.pyとして保存する。

# ファイルをオープンする
fileobject = open('test.txt', 'wt')

# ファイルに文字列(test)を記入
fileobject.write('test')

# ファイルを閉じる
fileobject.close()

上記処理実行前

$ cat test.txt 

上記処理実行後

$ python file_write.py 
$ cat test.txt 
test

ファイルからの読み取り

read()readline()などを使用する。

fileobject = open('test.txt', 'rt')
print(fileobject.read())
fileobject.close()

=========実行結果=========
test

引数なしでread()を使用すると、ファイル全体を呼び出すことになるため大きなファイルを使用する際は注意が必要になる。その際はread()に引数として数値を渡せば、文字数分のみ読み込んでくれるようになる。

fileobject = open('test.txt', 'rt')
chank = 1
print(fileobject.read(chank))
fileobject.close()

上記ではread()の引数にchankとして数値1を渡しているため、1文字ずつ読み込んでいる。

withを使った自動クローズ

開いたファイルを閉じ忘れると、ファイルが参照されなくなった時にPythonが自動的にclose()処理を行ってくれる。主に関数内で呼び出されれば関数の処理が終わるタイミング、メインプログラムであれば、そのメインプログラムが終わった時だ。(GCと同じタイミングと考えていいらしい)

しかしclose()処理を忘れてしまうと、エラーが発生してしまうと今までの書き込み処理などが全て消失してしまう恐れがある。このエラーが関数が終わる前などGCが発生する前に起きてしまうと処理が失われてしまう。

そのようなclose()忘れを防ぐためにwithというものがある。

with open('test.txt', 'wt') as f:
    t.write('string')

上記のような書き方をするだけで、with句を抜けた際自動的にclose()がされる。

Let's Try

課題1. 10行のファイルを用意して1行ずつ表示するプログラムを作成してみよう

例) 10行のテキストファイル

abc
def
ghi
jkl
mno
pqr
stu
vwx
yz!
???

実行結果

$ python file_readline.py 
abc
def
ghi
jkl
mno
pqr
stu
vwx
yz!
???

課題2. ファイルが存在する場合にxを指定した際にどのようなエラーが出るか確認してみよう

実行結果

$ python file_write_xoption.py 
Traceback (most recent call last):
  File "file_write_xoption.py", line 1, in <module>
    fileobject = open('test.txt', 'xt')
FileExistsError: [Errno 17] File exists: 'test.txt'

次回はこちら ultrabirdtech.hatenablog.com