2011-06-07

PythonとPerlを比較(1)

まずPerlの
  while(<>){ print; }
と同等のスクリプトはどう書くのか?

import sys
for line in sys.stdin:
    print(line),

または

import sys
for line in sys.stdin:
    line = line.rstrip('[\r\n\t ]')
    print(line)
このimport sysはないとエラー。
    print(line),
のカッコはpython2.5はなくてもいいけど、3.0以降必要なのでつけておく。
3.0では最後の , で改行しないという方法は無効なので、
rstrip(右側を s/[\r\n\t ]// する)する方法も作った。python3.0でそのまま通る。このとき import re 要らないのは意外。

sys.stdout.write("abc2")
なら改行しない出力がpython3、2共通で使えそうだ


じゃあ次、Perlの
  while(<>){ s/([0-9]+)/_number$1_/g; print; }
と同等のスクリプトはどう書くのか?

import sys, re
for line in sys.stdin:
    line = re.sub('([0-9]+)', r'_number\1_', line)
    print(line),

    line = re.sub('([0-9]+)', r'_number\1_', line)
は引数にMatchPattern, replace, origStr, countを取り、返り値にnewStr。
r'_number\1_'の r は raw stringの略。pythonはシングルクォートでも \n が改行になるので、
\\nと書くか、 r をつける。後方参照は \1 と使う。
countを省略すると Perlのglobal置換と同じ。countのところに「,1」とすると最初の一組のみ置換。


じゃあ次、ファイルの中身を読み出すには?

import sys
f = open('test.txt', 'rb')
for line in f :
    line = line.rstrip()  #改行などを削除
    print(line)
f.close()

ファイルの中身を空白またはタブで区切って読み込む

for line in open('test.txt', 'rb') :
    line = line.rstrip()
    ilist = line.split(" ")  #stringは空白のみ
    print(ilist)


同じことだがファイルを1行づつでなくまとめて読み込む

from var_dump_lib import var_dump
import re
lines = open('test.txt', 'rb').read() #1つの文字列になっている。Perlみたいに配列にはなっていない
print(lines)
var_dump(lines)
#for line in lines.split("\r\n") :
for line in re.split("[\r\n]+", lines) :
    ilist = re.split("[ \t]+", line)  #reなら空白・タブともに
    print(ilist)



from A import B でファイルA(ここでは var_dump_lib.py) から関数Bを読み出す。
もし import var_dump_lib だけ書いたら
var_dump_lib.var_dump(a)としないと関数が呼べない。
つまりファイル名がnamespaceになる。

ファイルの書き込みは
# coding: UTF-8
str = open('test.txt', 'rb').read()
import re
str2 = re.sub(r'([0-9]+)', r'数字\1', str)
open('test2.txt', 'wb').write(str2)

0 件のコメント:

コメントを投稿

人気記事