【Python】コメント除外機能を搭載したテキストファイル読み出し関数を作る

Tips

タイトルそのまま。

 

目的

テキストファイルを読みだす際、コメント行を除外して出力させたかった。

それだけ。

 

コード

まずは使用するテスト用テキストファイル。

テスト用テキストファイル

$ cat test.txt
aaaaa
bbbbb
ccccc
ddddd
;eeeee
#fffff
ggggg

一般的には#がコメント行だと思うけど、たまに;がコメント文字になっていることもあるのでそれも含めて対応したかった。

 

テキストファイル読み出し関数(改修前)

def readFile(_path):
  with open(_path, 'r') as f:
    return str(f.read())

超単純かつ標準的なテキストファイル読み出し関数。

これをベースに改修していく。

 

テキストファイル読み出し関数(改修後)

def readFile(_path, comm=False, commchar='#'):
  # コメント文字が1文字より多い場合、デフォルトのコメント文字に直す
  if len(commchar) > 1:
    print('commchar is too long. "' + commchar + '" -> "#"' )
    commchar = '#'
  
  # コメント機能をTrueにした場合の処理
  if comm:
    textStr = ''
    resStr = ''
    with open(_path, 'r') as f:
      textStr = str(f.read())
    for s in textStr.split('\n'):
      # 文字列が空か、先頭文字がコメント文字の場合はスキップ
      if len(s) == 0 or s[0] == commchar:
        continue
      else:
        resStr = resStr + s + '\n'
    return resStr
  # Defaultの処理
  else:
    with open(_path, 'r') as f:
      return str(f.read())

改修したらめっちゃ長くなった。

多分もっと縮められると思うんだけど、コーディング大会をしているわけでもないので無視。

python初心者なんで、non-key引数しか使ってこなかったけど、keyword引数を使うとめっちゃ捗る。

今回はそれとDefault引数を使って実現。

今回は1文字のコメント文字にのみ対応のため、引数にされたコメント文字が2文字以上の場合はデフォルトに戻すような処理に。

後は読んだ通り。

 

実行

メイン関数

def main():
  print("------- [test 1 start] -------")
  print(readFile('test.txt'))

  print("------- [test 2 start] -------")
  print(readFile('test.txt', comm=True))

  print("------- [test 3 start] -------")
  print(readFile('test.txt', comm=True, commchar=';'))

  print("------- [test 4 start] -------")
  print(readFile('test.txt', comm=True, commchar='##'))

  

実行結果

------- [test 1 start] -------
aaaaa
bbbbb
ccccc
ddddd
;eeeee
#fffff
ggggg
------- [test 2 start] -------
aaaaa
bbbbb
ccccc
ddddd
;eeeee
ggggg
------- [test 3 start] -------
aaaaa
bbbbb
ccccc
ddddd
#fffff
ggggg
------- [test 4 start] -------
commchar is too long. "##" -> "#"
aaaaa
bbbbb
ccccc
ddddd
;eeeee
ggggg

ちゃんとコメント文字が長すぎるときはデフォルトに戻してくれてる。

コメント

タイトルとURLをコピーしました