実装関連事項

各種プログラミング言語の基本的な書き方やソフトウェア等の使用方法について.

乱数

乱数はライブラリ random を使うことで扱うことができる.乱数の種は random.seed() で指定する.0から99までの数から,50個をランダムにサンプリングしたい場合は以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
random.seed(0)

def main():
	sample=random.sample(range(100),50)
	print(sample)

if __name__ == '__main__':
	main()

クォーテーションの中での変数展開

クォーテンションの中における変数の展開は以下のように書く.%(変数名)d とすると数値が展開,%(変数名)s とすると文字列が展開される.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	memreq="-l s_vmem=%(mem)dG,mem_req=%(mem)dG"%{"mem":10}
	print(memreq)

if __name__ == '__main__':
	main()

以下のようにも書ける.これの方が便利.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	mem=10
	memreq="-l s_vmem=%(mem)dG,mem_req=%(mem)dG"%locals()
	print(memreq)

if __name__ == '__main__':
	main()

配列の操作

配列に新たな要素を追加するには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lifile=[]
	file="foo.seq"
	lifile.append(file)

if __name__ == '__main__':
	main()

配列の長さは以下で取得する.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lifile=["aaa","bbb","ccc"]
	print(len(lifile))

if __name__ == '__main__':
	main()

用意した配列の中に目的の要素が存在するかどうかの確認は以下のようにする.存在しないことは,"not in list" で確認できる.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lifile=["aaa","bbb","ccc"]
	if "ddd" in lifile:
		print("sonzai suru")
	else:
		print("sonzai shinai")

if __name__ == '__main__':
	main()

数字が格納された文字列配列を整数配列に変換するには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lia=['1','2','3']
	lia=[int(i) for i in lia]

if __name__ == '__main__':
	main()

逆に整数を文字列に変換したい場合は以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lia=[1,2,3]
	lia=[str(i) for i in lia]

if __name__ == '__main__':
	main()

二次元配列を静的に確保するには以下のようにする.この場合生成されるのは,全要素が0の327行28列の配列.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lia=[[0 for j in range(28)] for i in range(327)]

if __name__ == '__main__':
	main()

ディクショナリ

キーを用いてディクショナリの値にアクセスするには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lifile=["aaa","bbb","ccc"]
	difile=dict(zip(range(1,len(lifile)+1),lifile)) # リストの変換.リストの要素の番号がキー,要素が値.
	
	for key in difile.keys():
		print(difile[key])

if __name__ == '__main__':
	main()

配列をディクショナリに変換するには以下のように書く.この場合,ハッシュの全ての値は1となる.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lix=list(np.random.choice(1601009,20000,replace=False))
	dix=dict(zip(lix,[1 for i in range(20000)]))

if __name__ == '__main__':
	main()

環境変数の取得

Pythonでは環境変数はディクショナリに格納される.取り出すには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

def main():
	SGE_TASK_ID=os.environ["SGE_TASK_ID"]

if __name__ == '__main__':
	main()

ファイル等の存在確認

ファイルやディレクトリの存在確認は以下のようにする.ファイルやディレクトリが存在しないことは,"if not os.path.exists():" で確認する.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

def main():
	if os.path.exists("foo/bar.txt"):
		print("sonzai suru")

if __name__ == '__main__':
	main()

ディレクトリ関連の操作

ディレクトリの作成は os.makedirs() を用いるのが便利.以下のように書くと,application,application/ncbi および application/ncbi/blast という3つのディレクトリを一度に作ることができる.オプションの"exist_ok=True"を加えると,作ろうとするディレクトリが既に存在している場合にエラーメッセージを表示させない.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

def main():
	method="blast"
	os.makedirs("application/ncbi/%(method)s"%locals(),exist_ok=True)

if __name__ == '__main__':
	main()

ディレクトリを指定して,その中にあるファイルの一覧を配列として取得するには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

def main():
	listfile=os.listdir("foo/bar")
	for file in listfile:
		print(file)

if __name__ == '__main__':
	main()

ファイルの読み込み・書き込み

ファイルを読み込むには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	fin=open("file.txt","r")
	for line in fin:
		print(line,end="")
	fin.close()

if __name__ == '__main__':
	main()

ファイルへの出力,ファイルに書きこむには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	fout=open("file.txt","w")
	print("foo","\t","bar","\n",sep="",end="",file=fout)
	fout.close()

if __name__ == '__main__':
	main()

クラス

クラスは以下のように定義し,インスタンスを生成し,使用する."__init__()" はインスタンスが生成された際に呼び出されるメソッドであり,C++でいうところのコンストラクタのこと.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Point:
	""" explanation of the class """
	def __init__(self,a,b):
		self.a=a
		self.b=b
	
def main():
	foo=Point(1,2)
	print(foo.a)
	print(foo.b)

if __name__ == '__main__':
	main()

文字列の連結

文字列の連結・結合は以下のように書く.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	dir="db/uniref/"+"UPI0005C333A5.seq"
	print(dir)

if __name__ == '__main__':
	main()

正規表現

正規表現による文字列の検索,置換は以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re

def main():
	file="foo.fa"
	if(re.search(".fa$",file)):
		file=re.sub(".fa$","",file)

if __name__ == '__main__':
	main()

正規表現による文字列の分割は以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re

def main():
	fin=open("foo.fa","r")
	for line in fin:
		litmp=re.split("\s+",line)
		print(litmp[0])

if __name__ == '__main__':
	main()

外部プロセスの実行

外部コマンドをシェル経由で実行するには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess

def main():
	subprocess.call("mkdir abc",shell=True)

if __name__ == '__main__':
	main()

外部コマンドを実行して,標準出力の情報を取得,その結果を一行ずつリストに格納するには以下のようにする.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess

def main():
	lifoo=subprocess.check_output("mkdir abc && ls |egrep ab",shell=True).decode('utf-8').rstrip().split('\n')

if __name__ == '__main__':
	main()

nanの判定

変数 foo が nan であるかどうかは以下のような方法で確認できる.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	if foo!=foo:
		print("This variable includes \"nan\".")

if __name__ == '__main__':
	main()

リストを括弧なしで簡易的に出力する方法

以下のように print() を使うと,出力したい値の左右にそれぞれ [ と ] が出力される.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lix=[1,2,3,4,5]
	print(lix)

if __name__ == '__main__':
	main()

値が文字列の場合,以下のように書くと括弧なしで出力できる.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lix=["a","b","c","d","e"]
	print(", ".join(lix))

if __name__ == '__main__':
	main()

値が文字列以外の場合,以下のように書くと括弧なしで出力できる.この場合,セパレーターはコンマと空白文字.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lix=[1,2,3,4,5]
	print(str(lix)[1:-1])

if __name__ == '__main__':
	main()

または以下のようにも書ける.この場合,セパレーターは空白文字のみとなる.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def main():
	lix=[1,2,3,4,5]
	print(*lix)

if __name__ == '__main__':
	main()
Hatena Google+