タイトルそのまま。
目的
テキストファイルを読みだす際、コメント行を除外して出力させたかった。
それだけ。
コード
まずは使用するテスト用テキストファイル。
テスト用テキストファイル
$ 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
ちゃんとコメント文字が長すぎるときはデフォルトに戻してくれてる。
コメント