python備忘録



# 標準
## 終了
```py
sys.exit()  # 正常終了 SystemExit例外を送出する
sys.exit('error!') # 異常終了 文字列をstderrに吐いてステータス1 SystemExit例外を送出する
os._exit(n) # ステータスnでプロセスを終了 例外を投げない
raise exception # 例外を投げる
```

## パス
```py3
# スクリプト実行時のパス
__file__    # スクリプトファイル自身の相対パス
os.getcwd() # カレントディレクトリの絶対パス
sys._getframe().f_code.co_name  # 実行中の関数名/メソッド名
os.path.dirname(os.path.abspath(__file__)) # スクリプトの親ディレクトリの絶対パス（よく使うので）
# パス参照
os.path.dirname(filepath)  # ファイルパス → １つ上のディレクトリパス
os.path.basename(filepath) # ファイルパス → ファイル名
os.path.abspath(filepath)  # ファイル相対パス → ファイル絶対パス
os.path.exists(filepath)   # ファイル存在確認 → True or False
os.path.isfile(filepath)   # ファイルであるか確認 → True or False
os.path.isdir(dirpath)     # ディレクトリであるか確認 → True or False
os.wark(dirpath)           # Linuxのfindコマンドのように配下を辿る 結果は [(path, [dir,...], [file,...]),...] の形
# ファイル操作
os.mkdir(dirname)          # ディレクトリ作成
os.makedirs(dirpath)       # ディレクトリ作成(mkdir -pと同様)
shutil.copyfile(src, dst)  # ファイル→ファイル のコピー
shutil.copy(src, dst)      # ファイル→ディレクトリ のコピー
shutil.copytree(src, dst)  # ディレクトリ→ディレクトリ のコピー
os.remove(filepath)        # ファイル削除
os.rmdir(dirpath)          # 空ディレクトリ削除
os.removedirs(dirpath)     # ディレクトリツリー削除（ファイルがあるとエラー）
shutil.rmtree(dirpath)     # ディレクトリツリー削除（ファイルがあっても削除）
```

## ファイル読み書き
```py3
# 新記法（自動でcloseする）
with open(filename, 'w') as file:
    file.write(str)
# 旧記法
file = open(filename, 'w')
try:
    file.write(str)
finally:
    file.close()
# 文字コード指定
with codecs.open(filename, 'w', 'shift_jis') as file:
    file.write(str)
```

## confファイル操作
```conf
[section]
option = value
```
↑が↓

```py
config['section']['option'] = 'value'
```

基本的に辞書型に準拠した動作をするが、以下が異なる。
+ optionには大文字小文字の区別無し
+ `DEFAULT`というsectionは元々存在し、削除不可

`{key: {k: v for k, v in value.items()} for key, value in config.items()}`で辞書型として構築しなおしてみる。

```py3
import configparser
config = configparser.ConfigParser()
config['DEFAULT'] = {'ServerAliveInterval': '45',  # DEFAULTセクションにitemを設定
                     'Compression': 'yes',
                     'CompressionLevel': '9'}
with open('example.ini', 'w') as configfile:
    config.write(configfile)
# 読み出し
config = configparser.ConfigParser()
config.read([os.path.dirname(__file__) + '/' + INI_FILE], encoding='utf-8')
userid = config['DEFAULT']['userid']
```

## SQLite3
```py
# 使用準備
import sqlite3
conn = sqlite3.connect('example.sqlite3')
c = conn.cursor()
# SQL発行
c.execute("""INSERT INTO stocks
          VALUES ('2006-01-05','BUY','RHAT',100,35.14);""")
## 文字列へ変数を埋め込む　埋め込みにはタプルを使う
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
## 複数のタプルを埋め込む
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
# SELECT結果参照方法４つ
for row in c.execute('SELECT * FROM table'): # イテレータとして取り出す
    print(row)
row = c.fetchone() # 1行取り出す 取り出す行がなければNoneが返る
some_rows = fetchmany(size=cursor.arraysize) # 指定行数取り出す
all_rows = fetchall() # 全行取り出す
```

### オマケ：

```sqlite3
# テーブル存在チェック
SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=table;
# テーブル作成
CREATE TABLE table(column1 [datatype1] [,column2 [datatype2] ...]);
# データ追加
INSERT INTO t (columname1,column2…) VALUES (value1,value2…);
# データ更新
UPDATE table SET column::=value [,...] [WHERE conditions];
# 検索
SELECT column [,...] FROM table [WHERE conditions];
# テーブル削除
DROP TABLE table;
```

# phantomJS with selenium

```py3
from selenium import webdriver
driver = webdriver.PhantomJS() # PhantomJSドライバ作成
driver = webdriver.PhantomJS(service_log_path=log_name) # ログファイル指定(default: './ghostdriver.log')
driver = webdriver.PhantomJS(service_log_path=os.ttyname(sys.stdout.fileno()))  # ログを標準出力へ
driver = webdriver.PhantomJS(service_log_path=os.path.devnull) # ログを/dev/nullに捨てる
driver.set_window_size(1024, 768)
driver.get('https://google.com/')
driver.save_screenshot('google.png')
```

```py3
find_element_by_id()
find_element_by_name()
find_element_by_xpath()
find_element_by_link_text()
find_element_by_partial_link_text() # <a>で括られたテキストを指定
find_element_by_tag_name()          # htmlタグの名前を指定
find_element_by_class_name()
find_element_by_css_selector()
```

# 参考
[8. エラーと例外 — Python 3.5.1 ドキュメント](http://docs.python.jp/3.5/tutorial/errors.html)
[12.6. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース — Python 3.5.1 ドキュメント](http://docs.python.jp/3.5/library/sqlite3.html)
[14.2. configparser — 設定ファイルのパーサー — Python 3.5.1 ドキュメント](http://docs.python.jp/3.5/library/configparser.html)
[16.1. os — 雑多なオペレーティングシステムインタフェース — Python 3.5.1 ドキュメント](http://docs.python.jp/3/library/os.html#os._exit)
[29.1. sys — システムパラメータと関数 — Python 3.5.1 ドキュメント](http://docs.python.jp/3/library/sys.html#sys.exit)
[__xxx__ 形式の特殊メソッド、特殊フィールド » Python Snippets](http://python.civic-apps.com/__xxx__/)