Pythonの標準ライブラリ（学んだこと）を備忘録としてまとめてみた。

## この記事について
python初心者である私が学習したものをまとめたものです．
学んだ標準ライブラリ超基本的なことを書きました．

## 実行環境
* Windows 10
* Anaconda3
* Python 3.7

## sysモジュール
* `sys`はPython実行中のシステムに関する情報を取得する変数，またはシステムに関する設定を操作する関数などを含んだモジュール
* `sys.argv`:コマンドライン引数を文字列のリストとして格納した変数
* `sys.exit(数値)`:引数に0を指定することでPythonを正常終了させる関数．0以外を引数に指定すると異常終了させる．
* `sys.getdefaultencoding()`:エンコードを暗黙的に変換するときに利用されるデフォルトエンコーディングを返す

```python
import sys

sys.getdefaultencoding() #'utf-8'
sys.exit(1)   #System Error : 1
```

## osモジュール
### osモジュールについて
* `os`はファイルやプロセスなどOSに関連する処理を行うためのモジュール

### osモジュールを使った操作一覧

#### ファイル、ディレクトリのパスに関する操作
* `os.getenv(環境変数名)`:引数で指定した環境変数の値を返す．存在しない場合は，オプションで指定した値を返す．

```python
import os 
os.getenv("JAVA_HOME") #'C:\\Java\\jdk1.8.0_201\\bin'
```

* `os.chdir(ディレクトリへのパス)`:カレントディレクトリを引数として指定されたパスに変更する
* `os.getcwd()`:カレントディレクトリへのパスを返す．

```python
os.chdir("C:\\Users\\gakuy\\PycharmProjects")
os.getcwd() #'C:\\Users\\gakuy\\PycharmProjects'
os.chdir('C:\\Users\\gakuy\\PycharmProjects\\pythonLearing')
os.getcwd() #'C:\\Users\\gakuy\\PycharmProjects\\pythonLearing'
```

* `os.remove(パス)`:引数に指定したパスにあるファイルを削除する．パスに指定した場所にディレクトリがある場合は，例外が発生．（ちなみに，ディレクトリを削除したい場合は，`rmdir()関数`を使う.
* `os.rename(変更元のパス,変更後のパス)`:ファイルやディレクトリの名前を変更する．
* `os.rmdir(パス)`:ディレクトリを削除する
* `os.removedirs(パス)`:ディクショナリを再帰的に削除する．指定されたディクショナリが存在している場合，すべて削除しようとする．
* `os.mkdir(パス)`:引数に指定したパスにディレクトリを作成する．

* `os.makedirs(パス)`:ディクショナリを再帰的に作成する．パスの途中に存在しないディレクトリが存在していた場合にはそれらを作成する．

* `os.listdir(パス)`:ファイルやディレクトリの一覧を返す．
* `os.walk(パス)`:引数として与えられたパスを起点として，ファイルやディレクトリなどの一覧を順番に返す．

```python
# os.mkdir(".\\work")#相対パスでworkディレクトリを作成
#os.makedirs(".\\work\\dir1\\sample")
os.listdir(".\\work") 
#結果['.ipynb_checkpoints', 'dir1', 'file1', 'file2']
```

```python
for dirpath, dirnames, filenames in os.walk(".\work"):
    print(dirpath)
# 結果
#.\work
#.\work\ipynb_checkpoints
#.\work\dir1
#.\work\dir1\sample
```
#### プロセス管理
* `os.system(コマンド文字列)`:引数に与えられたコマンド文字列を子プロセスとして実行する。
* `os.startfile(パス)`:パスを指定して、ファイルに関連付けられたアプリケーションで開く(windowsのみ利用可能な関数）

####パスを指定した操作をプラットフォーム互換で行う
* `os.path`にはOS間のディレクトリの扱いの差(ディレクトリの階層を区切る文字列表記の違い等）を吸収して処理を行える関数が集合している
* `os.path.exists(パス)`:ファイルやディレクトリが存在するかどうか調べる。存在すればTrue、引数がシンボリックリンクを指定した場合
* `os.path.getsize(パス)`:ファイルサイズを返す
* `os.path.isflie(パス)`:ファイルかどうか調べる
* `os.path.isdir(パス)`:ディレクトリかどうか調べる
* `os.path.join(パス1,パス2)`:パス名を結合して返す
* `os.path.split(パス)`:パスを分割して返す。引数として指定されたパスをディレクトリを表すヘッダ部分と、ファイルを表す部分に分割して文字列のリストを返す。

```python

import os

#os.startfile(".\\lessonpackage\\filelewith.py")   #ファイルを開く
cwd = os.getcwd()
print(cwd)
print(os.path.split(cwd))
#以下結果
C:\Users\gakuy\Desktop\lesson\python
('C:\\Users\\gakuy\\Desktop\\lesson', 'python')

```


## urllibモジュール
【できること】

* WebやFTPを使ったデータの取得が可能
* データをPOSTして、CGIやWebサービスの操作が可能
* 
* `urllib.request.urlretrieve(url,保存ファイル名,POST用のデータ)`:URLを指定してファイルを取得できる。戻り値として2つの値をタプルとして返す

```python
import urllib


urllib.request.urlretrieve('https://www.python.org/',"pytho_homepage.html") 
#以下、結果
#戻り値の1つ目は保存したファイル名,2つ目はレスポンスのヘッダ情報
('pytho_homepage.html', <http.client.HTTPMessage at 0x12b6d2a8710>)
```

* `urllib.request.urlopen(url,POST用データ,タイムアウト)`:インターネットから取得したデータを読み込み可能なファイル風のオブジェクトに格納して返す。読み込まれたデータはバイト型。返すオブジェクトには**シーク位置**が存在する。
* `f.read(整数のサイズ)`:fはurlopen()で返すオブジェクト。引数としてサイズ指定行う。指定なければ、すべて読み込む
* `f.readline(整数サイズ)`:fはurlopen()で返すオブジェクト。1行読み込んで文字列として返す

```python
import urllib
f = urllib.request.urlopen('https://www.python.org/')
print(f)
print(f.read())
# 以下結果
<http.client.HTTPResponse object at 0x0000012B6D2CFE10>
b'<!doctype html>\n<!--[if lt IE 7]>   <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> ...以下略....
```

* `f.geturl()`:取得したデータのURLを返す。
* `f.info()`:メタ情報を持つオブジェクトを返す。

```python
print(f.geturl())
print(f.info())
#以下結果
https://www.python.org/
Server: nginx
Content-Type: text/html; charset=utf-8
X-Frame-Options: DENY
#.....略.....
```

* `urllib.parse.ulencode(ディクショナリまたはシーケンス,doseq,safe,encoding,errors)`:ディクショナリまたはシーケンスからURLエンコードされたクエリ文字列を作成する。シーケンスを渡す場合に、doseqをTrueに指定する。引数safeでURLエンコードから除外する文字列指定する。引数encodingには要素の文字コードを指定する(デフォルトではutf-8）。引数errorsはencodingで指定した文字コードの変換エラーへの対処を指定する。(デフォルトはstrict)

```python
from urllib import request
from urllib import parse

postdic = {'name':'someone','email':'1234@bar.com'}

postdata = parse.urlencode(postdic,encoding='utf-8')
print(postdata) # 結果:name=someone&email=1234%40bar.com
file = request.urlopen('http://service.com/process.cgi',postdata.encode("utf-8"))# urlがダミーの為、「HTTPError: HTTP Error 404: Not Found」と表示される
```

* `urllib.parse.quote(文字列,safe,encoding,erros)`:引数で指定した文字列をURLエンコードして返す。
* `urllib.parce.quote_plus(文字列,safe,encoding,erros)`:quote()処理に加え、空白文字列を「+」に置換する。HTMLフォームに空白を含む場合に使用する。引数safeはデフォルト値なし。
* `urllib.parse.unquote(文字列,encoding,errors)`:URLエンコードされた文字列を通常の文字列に変換する。errorsのデフォルト値はreplace
* `urllib.parse.unquote_plus(文字列,encoding,errors)`:unquote()処理に加え、空白を半角プラスが置換する

```python
from urllib import parse
url = "https://www.google.com/webhp?ie=UTF-8#q="
url += parse.quote('python サンプルコード')
url #'https://www.google.com/webhp?ie=UTF-8#q=python%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89'

```

## io.StringIOモジュール
* `io.string(初期化用の文字列)`:文字列のバッファを使って動作するファイル風オブジェクトを返す[https://docs.python.org/ja/2.7/library/stringio.html] シーク位置を元にした読み書きの処理を行いたいときに使用

```python
from io import StringIO
f = StringIO()
f.write("a"*10)
f.seek(1)
f.read()
#結果：aaaaaaaaaa
```
## shelve,pickleモジュール
* オブジェクトの永続化とシリアライズをしたいときに使用

**【shelve】**

* `shelve`モジュールによってディクショナリの永続化が可能。
* `shelve.open(ファイル名,protocol,writeback)`:ファイル名を指定してshelveオブジェクトを返す。ディクショナリで利用できるすべての操作を行る。

```python
import shelve

d = shelve.open("shelvetest")
d.update({"one":1,"two":2})
list(d.items())
d.close()
#close()によってファイルを閉じshelveオブジェクトに登録されたない内容を書き出す。
#実際に作られるファイルは以下の通り
shelvetest.bak
shelvetest.dat
shelvetest.dir
```

**【pickle】**

* `pickle`モジュールによってオブジェクトの永続化やシリアライズが可能。
* pickle化(pickleを使ってシリアライズを行うこと）したオブジェクトは複数のプラットフォーム間で互換性がある。

```python
#オブジェクトをpickle化
import pickle
o = [1,2,3,{"one":1},{"two":2}]
pickle.dump(o,open("pickle.dump","wb")) #pickle.dumpを生成

o2 = pickle.load(open("pickle.dump","rb"))
o2
o2
#結果 [1, 2, 3, {'one': 1}, {'two': 2}]
```

## JSONモジュール
* JSON形式をPythonのデータ型に変換可能
* `json.loads(JSON文字列)`,`json.load(ファイル)`:JSON文字列をPythonのデータ型に変換。
* `json.dumps(Pythonオブジェクト,オプションの引数)`,`dump(Pythonのobj,ファイル)`:`dumps()`は引数に指定したオブジェクトをJSON文字列に変換する。`dump()`は指定されたファイルに書き出す。

```python

from urllib.request import urlopen
from json import loads

url = 'https://api.github.com/users/gvanrossum/repos'
body = urllib.request.urlopen(url1).read()
body = body.decode('utf-8')
repos = loads(body)
for r in repos:
    print(r['name'])
```