Python覚書

Pythonを使う機会があったので、つらつら覚書をしておきます。
バーーっとメモしたので読みにくいかも。。

* 設定値をconfigから読み込む
* 実行オプションの指定
* csvファイルの読み込み
* LISTのmemo
* ワンライナーのmemo
* XMLを生成する。
* requestを生成する

##Configの使い方
コンフィグはConfigParserを使用する。

```py
config_path = "./setting.conf"
file = ConfigParser.SafeConfigParser()
file.read(config_path)
conf = init_context.InitContext(file)
```

コンフィグはこう書いてあって

```py	
[host_settings]
host = 192.168.10.10
port = 8080
```

使うときは	
このように指定する

```py
conf.get("host_settings", "host")
```
	
##実行時のオプション指定

* オプションの設定

オプションのparserにはOptParserを使うと便利

```py
parser = OptionParser()
parser.usage = "usage: %prog [options] arg1 arg2"
parser.description = "ディスクリプションを書く"
parser.add_option("-f", action="store", type="string", dest="file",help="ヘルプを読んだ時の説明文")
parser.add_option("-d", action="store_true", dest="debug",help="debug mode", default=False)
```

と書いたら
オプション「-f」を使用すると
オプション-fで指定した引数が
パースすると、destで指定しているfileという識別子で利用できる。
※引数の解析で表すような感じ

オプション「-d」を使用した場合
action="store_true"って指定すると、そのオプション指定があった時、destにTrueを入れる。
defaultはオプション指定しなかった時のデフォルト値

helpで指定したものは、「-h」で実行すると、表示される。

 	
* 引数の解析

オプションの解析はこんな感じに使う

```py
(options, args) = parser.parse_args(sys.argv)
print options.file
```	

##ファイルの存在確認
読み込む前には存在確認を。

```py
os.path.exists(file_path) 
```

	
##CSVファイルの読み込み

* ファイルの読み込みオープンとレコードの読み込み

```py
f = open(file_path, 'rb')
reader = csv.reader(f)
```

* レコード分繰り返す　Dataには配列で各カラムが入ってる

```py
for Data in reader:
    print Data[0]
```
	
* 最後はクローズする

```py
f.close
```
	
##listのmemo
* リストに追加する

```py
list.append
```

* ディクショナリはmutable、タプルはimmutable
* データフォーマットは　"%s %d" % ("string",number) のように後ろにタプルを追加する。

## 戻り値の使い方memo
返却値を2つにすることも出来る。
user, name = method()

## ワンライナー

```py
[method() for user in users if user.name == "yuta"]
```	

usersのなかのuser要素のnameがyutaだったらmethodを呼ぶ、みたいに書ける。
これと一緒

```py
for user in users :
	if user.name == "yuta":
		method()
```

## Requestの使い方

```py
url = "http://localhost:8080/target"
body = "json or xml"
	
response = requests.post(url, data=body)
```

でrequest投げれちゃう

## XMLつかうとき

* XMLの解析

```py
import xml.etree.ElementTree as ET
element_tree  = ET.fromstring(xml_text)            # ここがルートになる。これは文字列をXMLのエレメントに変換してる
code = element_tree.get("code")                    # 変換したから、elementの関数で値を取得できる。この場合はcode属性の値
name = element_tree.find("name_list").get("name")  #この場合はnama_list要素のname属性の値	
```

* XMLのbuild

```py
Body = ET.Element("root")
Body.set("name", "yuta")                               #root要素のname属性の値を"yuta"で追加
subbody = ET.SubElement(Body, "age")                   #rootエレメントにage要素を追加。そのオブジェクトをsubbodyに。
subbody.text = 29                                      #subbodyオブジェクトのテキストは、値として設定される
ET.SubElement(Body, "address", {"city": "tokyo"})    #rootオブジェクトに更に追加する場合はこうする。更に追加するときにcity属性、値はSaitamaを追加
```

こいつの下に更に追加するなら、オブジェクトを変数に取っておく必要があるが（ageの用に）
rootに追加するだけなら、上記でBodyに対して要素はすでに追加されている状態になる。
たとえば、

```
subbody = ET.SubElement(Body, "age")　
subbody.text = 29　　　　　　　　　　　　
```

で、子要素を追加するなら

```
ET.SubElement(subBody, "birthday_party", {"old": 10, "with_who": "family"})
ET.SubElement(subBody, "birthday_party", {"old": 20, "with_who": "honey"})
```

こんな感じでやればいい。
	
作成したXMLを文字列に変換するには、Elementのtostringが使えるが
以下を使えば、encoding='utf-8'がつく。tostringでやっても明記するように指定できない。
※xml_declaration=Trueが指定できない

```py
def to_xml_string(self, element):
    class dummy:
    pass

    data = []
    file = dummy()
    file.write = data.append
    ET.ElementTree(element).write(file, encoding="utf-8", xml_declaration=True)
    return "".join(data)
```	

Elementの使い方は別途まとめたいなぁ