Python3エンジニア認定基礎試験 勉強してみた4

# 「Python3エンジニア認定 ［基礎試験］」 合格を目指します。

使用教材：
・Pythonチュートリアル第4版 --オライリー・ジャパン--
・徹底攻略Python3エンジニア認定基礎試験 問題集 --impress--

前回の記事：
・[Python3エンジニア認定基礎試験 勉強してみた1](https://qiita.com/SHIRYU_0515/private/80be254354edc001258b)
・[Python3エンジニア認定基礎試験 勉強してみた2](https://qiita.com/SHIRYU_0515/private/84910ca285536e792ffe)
・[Python3エンジニア認定基礎試験 勉強してみた3](https://qiita.com/SHIRYU_0515/private/a267f9143b7dc1c92c21)

こんにちは！今回も続きで、
徹底攻略Python3エンジニア認定基礎試験 問題集を解きました。

第7章 **モジュール**
**7問中1問正解**
第8章 **ファイル入出力**
**7問中3問正解**

以下間違えた箇所の確認です。

## 見直し
**【モジュールのインポート】**
関数などをファイルに記述して、インタープリタや別のファイルからそのファイルを利用できる仕組みのことを**インポート**といい、インポートされるファイルを**モジュール**といいます。

```ruby:calenderモジュールをインポートする
import calender
```
```ruby:インポートしたcalenderモジュールの関数を実行する
calender.prmonth(2000, 1)
```
**【fromを使ったインポート】**
モジュールに含まれる関数のみをインポートするには、下記のように**from**を使用します。
```ruby:書式：関数のみをインポートする
from モジュール名 import 関数名
```
```ruby:add()関数のみをインポートする
from calc import add
```
**【ワイルドカードを使ったインポート】**
```ruby:書式：名前をすべてインポートする
from モジュール名 import *
```
ただし、アンダースコア「_」で始まる名前はインポートされません。
なお、モジュールに__all__という文字列のリストが存在した場合は、
そのリスト内の名前だけインポートされます。

**【asを使ったインポート】**
**as**を使うと、モジュールや関数を別名でインポートできます。
```ruby:書式：モジュールを別名でインポートする
import モジュール名 as モジュールの別名
```
```ruby:calendarモジュールを別名calでインポートする
import calendar as cal
```
```ruby:書式：関数を別名でインポートする
from モジュール名 import 関数名 as 関数の別名
```
```ruby:書式：calendar()関数を別名calでインポートする
from calendar import calendar as cal
```
**【__ name__】**
__name__は、モジュールの属性であり、モジュール名が自動で代入されます。
メインモジュールで実行している場合は、 " __ main __ "が代入されます。
```ruby:書式：メインモジュールか否かを判定する
if __name__ == "__main__":
    print("Main module") #何らかの処理
```
**【__ init __.py】**
package_name/ __ init __.pyというファイルがあるときに、
下記のようにpackage_nameをインポートすると、モジュールpackage_nameに
__ init __.pyの内容が読み込まれます。名前
```ruby:__init__.pyを読み込む（パッケージのインポート）
import package_name
```
このように、ディレクトリに __ init __.pyというファイルを配置すると、
ディレクトリ名のモジュールとしてインポートできます。
このような構成を**パッケージ**といいます。パッケージにすることで、
__ init __.pyだけでなく別の.pyファイルをまとめて扱えます。
この別のファイルをパッケージの**サブモジュール**といいます。
```ruby:ディレクトリ構成
bookcard/
    __ init __.py
    dump.py #dump_cardが定義されている
```
bookcard/ __ init __.pyが存在すればbookcardがパッケージになります。
また、bookcard/ __ init __.pyが空ファイルであっても、次のようにして、
サブモジュールのdumpからdump_cardをインポートできます。
```ruby:サブモジュールをインポートする
from bookcard.dump import dump_card
```
```ruby:サブモジュールを相対インポートする
from . import dump # __ init __.pyに記述する内容
```
**【相対インポート】**
ドット「.」を使ったインポートを**相対インポート**といいます。
相対インポートは、パッケージ内のサブモジュールをインポートする方法で、
サブモジュールに対してのみ実行できます。
相対インポートでは、次のようにサブモジュールを指定します。
```ruby:書式：同じ階層から別サブモジュールをインポートする
from . import サブモジュール名
```
```ruby:書式：1つ上の階層から別サブモジュールをインポートする
from .. import サブモジュール名
```
```ruby:書式：同じ階層の別サブモジュールから名前をインポートする
from . サブモジュール名 import 名前
```
```ruby:書式：1つ上の階層の別サブモジュールから名前をインポートする
from .. サブモジュール名 import 名前
```
```ruby:例：ディレクトリ構成
bookcard/
    __init__.py
    dump.py
    load/
        __init__.py #このファイルの内容を考える
        core.py
```
```ruby:例：同じ階層から別サブモジュールをインポートする
from . import core
```
```ruby:例：1つ上の階層から別サブモジュールをインポートする
from .. import dump
```
```ruby:例：1つ上の階層の別サブモジュールから名前をインポートする
from ..dump import *
```
**【open()関数】**
ファイルの操作ができる関数です。
mode引数を追加することで、ファイルの開き方を指定できます。
```ruby:書式：ファイルを開く
open("ファイル名", mode ="モード")
```
<table>
  <caption>【mode引数】</caption>
  <thead>
    <tr>
      <th>使用文字</th> <th>意味</th>
    </tr>
  </thead>
  <tr>
    <td> "r" </td> <td>読み込み専用</td>
  </tr>
  <tr>
    <td> "r+" </td> <td>読み書き両用</td>
  </tr>
  <tr>
    <td> "w" </td> <td>新規書き込み</td>
  </tr>
  <tr>
    <td> "a" </td> <td>追加書き込み</td>
  </tr>
　<tr>
    <td> "b" </td> <td>バイナリモード</td>
  </tr>
</table>

**※バイナリモード("b")だけの指定はできない。**

**【with文】**
ファイルを閉じるには**open()メソッド**を使用します。
また、**with文**を使うことで、この閉じる処理が自動で行われます。
この処理は例外が発生したときにも行われます。
```ruby:書式：ファイルを開く/閉じる
with open("ファイル名") as 変数:
    # ファイルの処理
```
**【ファイルを1行ずつ読み込む】**
```ruby:ファイルを1行ずつ読み込む
for s in fp: # 変数sに1行入る
```
```ruby:以下でも同様です
for s in fp.readlines(): # 変数sに1行入る

for s in list(fp): # 変数sに1行入る
```
**【JSON形式の書き込み】**
JSON（JavaScript Object Notation）とは、JavaScriptのオブジェクト表記を用いたデータ交換用フォーマットのことです。Pythonで作成したオブジェクトをJSON形式で書き込むには、**json.dump()メソッド**を使用します。
```ruby:JSON形式で書き込む①
json.dump(data, fp) # data：JSON形式に変換するオブジェクト
```
```ruby:JSON形式で書き込む①(キーワード引数使用)
json.dump(fp=fp, obj=data) # data：JSON形式に変換するオブジェクト
```
```ruby:JSON形式で書き込む②
fp.write(json.dumps(data)) # data：JSON形式に変換するオブジェクト
```
**【JSON形式の読み込み】**
JSON形式のデータを読み込んで、Pythonのオブジェクトとして取得するには、
**json.load()メソッド**を使用します。
```ruby:JSON形式を読み込む①
json.load(fp)
```
```ruby:JSON形式を読み込む②
json.loads(fp.read()) # fp.read()：JSON形式の文字列
```
次の記事
[Python3エンジニア認定基礎試験 勉強してみた5](https://qiita.com/SHIRYU_0515/private/76ef00a92f64d880fca6)