Python3エンジニア基礎試験_模擬試験の復習⑦

# パッケージとは

モジュールを階層的に組織化するための仕組みです。
パッケージは通常、ディレクトリとして表現されます。
ディレクトリ内には、`__init__.py` ファイル（空のファイルでも構いません）と、
パッケージ内で利用する複数のモジュールファイルが含まれます。

※追記予定

# 標準入力と標準出力

コードを実行した際の入力と出力は、大きく以下の3つに分類できます。

1. 標準入力：キーボードやファイルなどからのデータ入力（`input()`関数など）
1. 標準出力：コードセルのアウトプットやコンソールへの出力（`print()`関数など）
1. 標準エラー出力：エラーメッセージの出力

# input()関数について

`input()`関数を使用することで、キーボードからの入力値を受け取ることができます。
受け取ったデータは<font color="Red">**文字列に変換される**</font>という特徴があります。

```input.py
input("何かを入力してください") 
```

```input.py
data = input()
type(data)
# str
```
整数を入れてみます。

```input.py
num = input("整数を入力")
num
type(num)
# 整数を入力100
# str
```

`input()`関数で受け取った値はすべて文字列に変換されます。
受け取った値を数値として扱いたい場合は、`int()`関数などを使って、数値のデータ型に変換します。

```input.py
num = int(input("整数を入力"))
num
type(num)
# 整数を入力100
# int
```

# print()関数について

`print()`関数は、受け取ったオブジェクトを内部で`str()`関数を使って文字列に変換し、出力します。なお、もともと文字列だった場合は変換処理は行われません。
また、末尾に自動で改行が投入されます。

```print.py
print("Hello World")
# Hello World
```

`type()`関数でデータ型を調べてみます。

```print.py
type(print("Hello World"))
# Hello World
# NoneType　← None??
```

● 解説
1. まず、`print("Hello World")` は、"Hello World" という文字列を表示するために `print()`関数を呼び出しています。このコードは、文字列をコンソールに出力する役割を持ちます。
1. しかし、`print()`関数は `None` を返すため、print("Hello World") 自体の値は `None` です。
   つまり、`print("Hello World")` は表示するだけで、値を返しません。

# sys.stdout、sys.stdout.write()について

`sys.stdout`は、標準出力されたテキストファイルを指します。
`sys.stdout` は、Pythonの `sys` モジュールに定義されている標準出力ストリーム（standard output stream）を表すオブジェクトです。
また、`sys.stdout.write()`を使用することでことで値を出力できます。
なお、出力結果の末尾には改行が入りません。

```stdout.py
import sys

sys.stdout.write("Hello World1")
sys.stdout.write("Hello World2")
# Hello World1Hello World2 ←改行されていない
```

# 文字列のフォーマット

※追記予定

# ファイルの読み書き

Pythonでは、ファイルを下記のように区別している。
1. テキストタイプ：文字符号化形式（UTF-8など）でデコードするよう指定されているファイル
1. バイナリタイプ：文字符号化形式（UTF-8など）でデコードせずに、バイト列のまま読み書きするファイル

# open()関数について

`open()`関数は、ファイル名とモード（処理方法）を引数として渡します。
ファイル名には、ファイルのディレクトリパスも指定できます。
実行結果の戻り値として<font color="Red">**ファイルオブジェクト**</font>が返されます。
`open()`関数では処理が完了した後、<font color="Red">**`close()`メソッドを使ってファイルを閉じる必要があります。**</font>

**モードの種類**

| 文字 | 意味|
|:-:|:-:|
| **'r'**  | 読み込み用に開く（デフォルト) |
| **'w'**  | 書き込み用に開く  |
| **'x'**  | 排他的な生成に開き、ファイルが存在する場合は失敗する  |
| **'a'**  | 書き込み用に開き、ファイルが存在する場合は末尾に追記する  |
| **'b'**  | バイナリモード  |
| **'t'**  | テキストモード（デフォルト）  |
| **'+'**  | 読み書きの両方を行うためのモード  |

# ファイルオブジェクトを操作するメソッドについて

**ファイルオブジェクトを操作するメソッド一覧（例）**

● ファイルの内容を読み込む
・ `read()`：ファイルオブジェクトの内容を先頭から順に読み込む
・ `readline()`：ファイルの内容を先頭から順に1行ずつ読み込む

```read.py
f = open('test.csv', 'r')
f.read()
# test　※すべて読み込まれる
```

```readlines.py
f = open('test.csv', 'r')
f.readline()
# test ※一行ずつ読み込まれる
```

なお、for文を用いて読み込むことも可能です。

```for.py
f = open('test.csv', 'r')
for line in f:
    print(line, end='')
# test
```

● ファイルに内容を書き込む
・ `write()`：ファイルオブジェクトに文字列を書き込む

```write.py
fw = open('test.txt', 'w')
fw.write('test, Hello World')
fw.close()
```

`write()`メソッドでファイルオブジェクトに文字列を書き込んだ時点では、メモリに一時保管されているだけで実際の書き込みは行われません。<font color="Red">**`close()`メソッドなどでファイルを閉じた時点で、はじめて書き込みが行われます。**</font>また、文字列以外を書き込む際は、文字列に変換しておく必要があります。

● 先頭文字から数えた現在位置を扱う
・ `tell()`：ファイルの先頭から数えたバイト数を返す
・ `seek()`：ファイルの特定の位置に移動し、ファイルの先頭からのバイト数を返す

※seek()について、追記予定

● ファイルを閉じる
・ `close()`：`open()`関数で開いたファイルが占めていたシステムリソースをすべて解放する
・ `with open() as f:`

```close.py
fw = open('test.txt', 'r')
fw.read()
# 'test, Hello World'
fw.close()

fw.read()
# 再度、読み込みを行うとエラーとなる。
# ValueError: I/O operation on closed file.
```

```with.py
with open('test.txt', 'r') as f:
    read_data = f.read()
read_data
# 'test, Hello World'
```
with構文では処理が完了した後、自動的にファイルオブジェクトが閉じられているため、読み込もうとした場合エラーが発生します。

```with.py
f.read()
# ValueError: I/O operation on closed file.
```

# jsonファイルの操作について

`json（JavaScript Object Notation）`とは、JavaScriptのオブジェクト記法で定義されたデータ交換フォーマットのことです。`json`ファイルには、下記のようなJSON文字列が記録されています。

```sample.json
{ "name"   : "John Smith",
  "sku"    : "20223",
  "price"  : 23.95,
  "shipTo" : { "name" : "Jane Smith",
               "address" : "123 Maple Street",
               "city" : "Pretendville",
               "state" : "NY",
               "zip"   : "12345" },
  "billTo" : { "name" : "John Smith",
               "address" : "123 Maple Street",
               "city" : "Pretendville",
               "state" : "NY",
               "zip"   : "12345" }
}
```

sample.json：https://www.ibm.com/docs/ja/datapower-gateway/7.6?topic=json-examples

● load()関数

`load()`関数を使用することで、JSON文字列をPythonオブジェクトに変換できます。
このプロセスを<font color="Red">**デシリアライズ**</font>と言います。
また、`json`ファイルを扱うには、`json`モジュールをインポートする必要があります。

```read_json.py
import json

with open("sample.json",  'r') as f:
      data = json.load(f)
data
#{'name': 'John Smith',
# 'sku': '20223',
# 'price': 23.95,
# 'shipTo': {'name': 'Jane Smith',
#  'address': '123 Maple Street',
#  'city': 'Pretendville',
#  'state': 'NY',
#  'zip': '12345'},
# 'billTo': {'name': 'John Smith',
#  'address': '123 Maple Street',
#  'city': 'Pretendville',
#  'state': 'NY',
#  'zip': '12345'}}
```

変数`data`のデータ型を確認してみます。

```read_json.py
print(type(data))
# <class 'dict'>
```

このディクショナリオブジェクトから'name'というkeyを使って値を取り出してみます。
また、取り出した値のデータ型も確認してみます。

```read_json.py
print(data['name'])
print(type(data['name']))
# John Smith
# <class 'str'>
```

● dumps()関数

`dumps()`関数を使用することで、PythonオブジェクトをJSON形式の文字列に変換できます。
このプロセスを<font color="Red">**シリアライズ**</font>と言います。

先ほどのデシリアライズした値を格納した変数`data`を`dumps()`を使ってシリアライズしてみます。

```dumps_json.py
import json
json.dumps(data)
# {"name": "John Smith", "sku": "20223", "price": 23.95, "shipTo": {"name": "Jane Smith", "address": "123 Maple Street", "city": "Pretendville", "state": "NY", "zip": "12345"}, "billTo": {"name": "John Smith", "address": "123 Maple Street", "city": "Pretendville", "state": "NY", "zip": "12345"}}
```

シリアライズした際に返されるオブジェクトのデータ型を確認してみます。

```dumps_json.py
print(type(json.dumps(data)))
# <class 'str'>
```