L'Isola di Niente
L'Isola di Niente » Python Tips » Python Tips

Python Tips

2013.11.23 @ Python3 化

Linux コマンド
#!/usr/bin/env python3

'''
    いくつかの Linux コマンドを Python で再現
    又は結果を取得する方法
'''

import os
import subprocess

# カレントディレクトリの取得
# pwd
print(os.getcwd())

# ディレクトリ作成
# mkdir __temp__
os.mkdir("__temp__")

# カレントディレクトリの移動
# cd __temp__
os.chdir("__temp__")

# コマンドの実行結果の取得
# pwd
print(subprocess.check_output(["pwd"]))

# 環境変数一覧
# env
for key in os.environ.keys():
    print("{0}={1}".format(key, os.getenv(key)))

# ユーザーディレクトリ表示
# echo $HOME
print(os.getenv("HOME"))

# リダイレクト
# echo まどか > from.txt
with open("from.txt", "w") as f:
    f.write("まどか")

# リダイレクト(追記)
# echo \nほむら >> from.txt
with open("from.txt", "a") as f:
    f.write("\nほむら")

# コマンドの実行
# cp from.txt to.txt
subprocess.call(["cp", "from.txt", "to.txt"])

# ファイルの読み込み
# cat to.txt
with open("to.txt") as f:
    print(f.read())

# カレントディレクトリのファイル一覧
# ls
print(" ".join(os.listdir(os.getcwd())))

print
#!/usr/bin/env python3

# 改行防止
print("aaa", end="")

# sep にて結合文字を変更、標準は半角スペース
print("aaa", "bbb", sep=",") #=> aaa,bbb

# リダイレクト
with open("test.txt", "w") as f:
    print("てすと", file=f)

# {0} のエスケイプ
print("{{0}} {0}".format("のエスケイプ"))

アスタリスク
#!/usr/bin/env python3

'''
    関数の引数で * が一つならリスト、二つなら辞書という扱い
    呼び出し時の引数に明示的な [], {} は不要
'''

def list_func(*argv):
    for item in argv:
        print("{0}".format(item))

def dict_func(**argv):
    for key, value in argv.items():
        print("{0}: {1}".format(key, value))

list_func(1, "a", 3)
dict_func(yamaha="Jog", honda="Dio")

with as
#!/usr/bin/env python3

'''
    C# の IDisposable で using 文のように使えます
    というか IronPython なら using 文の代わりに利用できます
    __enter__ で self を戻し with を抜けると __exit__ を自動実行
    解りやすいように GUI で
'''

from gi.repository import Gtk

class MessageBox(Gtk.MessageDialog):
    def __init__(self, message=None):
        Gtk.MessageDialog.__init__(
                self,
                None,
                Gtk.DialogFlags.MODAL,
                Gtk.MessageType.WARNING,
                Gtk.ButtonsType.OK,
                message)

    def __enter__(self):
        return self

    def __exit__(self, *excinfo):
        print('excinfo =  {0}'.format(excinfo))
        self.destroy()

with MessageBox("with as") as dlg:
    dlg.run()

for ループ(同時、インデックス)
#!/usr/bin/env python3

MOTORS = ["YAMAHA", "HONDA", "SUZUKI", "KAWASAKI"]
CYCLES = ["YZF-R1", "CBR1000RR", "GSX-R1000", "ZX-10R"]

# synchronous loop
for motor, cycle in zip(MOTORS, CYCLES):
    print("{0}: {1}".format(motor, cycle))

# index
for i, cycle in enumerate(CYCLES):
    print("{0:03d}: {1}".format(i, cycle))

コードポイントの取得
#!/usr/bin/env python3

s = "コードポイント"
for a in s:
    print("[U+{0:04X}] ".format(ord(a)), end=" ")

文字列を逆転
#!/usr/bin/env python3

s = "あいうえお"
print(s[::-1])
#=>おえういあ

引数から自分を取り除く
#!/usr/bin/env python3

import sys

args = sys.argv[1:]
for s in args:
    print(s)

端末入力とパイプ入力で振り分け
#!/usr/bin/env python3

import sys, os

if os.isatty(0):
    # 通常起動、stdin が開いている
    print("コンソール")
else:
    # stdin がパイプで既に使われている
    # 行末に改行が含まれているので注意
    print(sys.stdin.read()[:-1])

''' output

$ ./atty.py
コンソール
$ echo HOGE | ./atty.py
HOGE

'''

端末から Ctrl+C で強制終了を実装
#!/usr/bin/env python3

from gi.repository import GLib

# This allows Ctrl+C to exit the program
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)

loop = GLib.MainLoop.new(None, False)
loop.run()

一行上に出力
#!/usr/bin/env python3

import sys, time

print("いくぞー")
for s in ["いーち", "にー", "さーん", "だぁー!"]:
    time.sleep(1)
    sys.stdout.write("\033[1A\033[0J") # 移動
    print(s)

色分け表示
#!/usr/bin/env python3

# Linux 専用

print("\033[32m緑色おおおお");
print("\033[31m赤色おおおお");
# 戻す
print("\033[39m", end='');

Fizz Buzz の例
#!/usr/bin/env python3

'''
    3 で割り切れる場合は Fizz
    5 で割り切れる場合は Buzz
    両者で割り切れる場合は Fizz Buzz というゲーム
'''

for i in range(1, 101):
    if i % 3 ==0:
        if i % 5 == 0:
            print("FizzBuzz")
        else:
            print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

Easter Egg
#!/usr/bin/env python3

import __hello__
import antigravity

タイマー
#!/usr/bin/env python3

import threading

count = 0

def start():
    """
        2s 毎に print; 5 回で終了
    """
    global count
    print("Count {0}".format(count))
    if count < 5:
        count += 1
        t = threading.Timer(2.0, start)
        t.start()

start()

四捨五入
#!/usr/bin/env python3

import math

n = 3.14
print("{0},{1},{2}".format(
    round(n),       # 四捨五入、math 不要
    math.ceil(n),   # 切り上げ
    math.floor(n))) # 切り捨て

#=>3,4,3

Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.