【Python入門者必見】Pythonを書くほど階級が上がるプログラムを公開,pyroad.py

pyroad.pyというファイルをディレクトリに置いて下さい。
どんなディレクトリに置けば良いかというと、Pythonの勉強やテストのために書いたpyファイルがたまってるようなところです。
Python関連の本や書籍のプログラムを写経したりしますよね、そのフォルダです。

こちらをコピペしてください。

import os
import datetime


def allFileListGet():
    path = '.'
    file_list = []
    for root, dirs, files in os.walk(path):
        for file in files:
            file_list.append(os.path.join(root, file))

    return file_list


def pyFileListGet(allFileList):
    pyFileList = []
    for file_name in allFileList:
        if file_name[-3:] == '.py':
            pyFileList.append(file_name)

    return pyFileList


def returnLines(pyList):
    line_sum = 0
    for file_name in pyList:
        lines_count = sum(1 for line in open(f'{file_name}'))
        line_sum += lines_count

    return line_sum


def fileWrite(data):
    f = open('pyroad.txt', 'a')
    now = datetime.datetime.now()
    f.write(f'{data},{now.year},{now.month},{now.day},{now.hour},{now.minute},{now.second}\n')
    f.close()


pyroadCount = sum(1 for line in open('pyroad.py'))  # pyroad.pyの行数は除外
allLines = returnLines(pyFileListGet(allFileListGet())) - pyroadCount

rankList = ['二等兵', '一等兵', '上等兵', '伍長', '軍曹', '曹長', '准尉',
            '少尉', '中尉', '大尉', '少佐', '中佐', '大佐', '准将',
            '少将', '中将', '大将', '元帥']
levelLinesList = [1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000,
                  12000, 14000, 16000, 18000, 20000, 25000, 30000, 50000]

if allLines < levelLinesList[0]:
    print(f'{allLines}行Pythonを書いているぞ!')
    print(f'お前は{rankList[0]}でまだ新米パイソニスタだ。\n書け!書けば分かる!')
    print('ごちゃごちゃ考えるな。1行でもコードを書け!')
elif allLines > levelLinesList[-1] - 1:
    print(f'{allLines}行もPythonを書いているとは...')
    print(f'あなた様は{rankList[-1]}です。')
    print('その調子でがんばってください。')
else:
    for i, _ in enumerate(levelLinesList):  # 小さいほうから総当りの方法
        if allLines > levelLinesList[i] - 1 and allLines < levelLinesList[i+1]:
            print(f'{allLines}行Pythonを書いているぞ!')
            print(f'お前は{rankList[i+1]}パイソニスタだ!')
            print('ごちゃごちゃ考えるな。1行でもコードを書け!')
            break

# データの書き込み
fileWrite(allLines)

詳しくコメントを書いたバージョンはこちらです。

import os
import datetime


# 現在ディレクトリ以下のファイルをすべて取得する
# 現在ディレクトリの中のディレクトリの中身も含める
def allFileListGet():
    path = '.'  # '.'は現在ディレクトリの意味
    file_list = []
    for root, dirs, files in os.walk(path):
        for file in files:
            file_list.append(os.path.join(root, file))

    return file_list


def pyFileListGet(allFileList):
    pyFileList = []
    for file_name in allFileList:
        if file_name[-3:] == '.py':  # .pyで終わるファイルのみ取得
            pyFileList.append(file_name)

    return pyFileList


def returnLines(pyList):  # pyファイルの行数をすべて足す
    line_sum = 0
    for file_name in pyList:
        lines_count = sum(1 for line in open(f'{file_name}'))
        line_sum += lines_count

    return line_sum


# python pyroad.pyなどと実行した時に、実行結果をpyroad.txtに保存
# 行数,年,月,時,分,秒 の順番で書き込む
def fileWrite(data):
    f = open('pyroad.txt', 'a')
    now = datetime.datetime.now()
    f.write(f'{data},{now.year},{now.month},{now.day},{now.hour},{now.minute},{now.second}\n')
    f.close()


pyroadCount = sum(1 for line in open('pyroad.py'))  # pyroad.pyの行数は除外
# 現在ディレクトリでpyroad.pyを除いたpyファイルの行数を取得
allLines = returnLines(pyFileListGet(allFileListGet())) - pyroadCount

# 1000行未満は二等兵。1000行以上2000行未満は一等兵という順。
rankList = ['二等兵', '一等兵', '上等兵', '伍長', '軍曹', '曹長', '准尉',
            '少尉', '中尉', '大尉', '少佐', '中佐', '大佐', '准将',
            '少将', '中将', '大将', '元帥']
levelLinesList = [1000, 2000, 3000, 5000, 6000, 7000, 8000, 9000, 10000,
                  12000, 14000, 16000, 18000, 20000, 25000, 30000, 50000]

if allLines < levelLinesList[0]:  # 1000行未満の場合
    print(f'{allLines}行Pythonを書いているぞ!')
    print(f'お前は{rankList[0]}でまだ新米パイソニスタだ。\n書け!書けば分かる!')
    print('ごちゃごちゃ考えるな。1行でもコードを書け!')
elif allLines > levelLinesList[-1] - 1:  # 50000行以上の場合
    print(f'{allLines}行もPythonを書いているとは...')
    print(f'あなた様は{rankList[-1]}です。')
    print('その調子でがんばってください。')
else:  # 上の2つ以外の場合
    for i, _ in enumerate(levelLinesList):  # 小さいほうから総当りの方法
        if allLines > levelLinesList[i] - 1 and allLines < levelLinesList[i+1]:
            print(f'{allLines}行Pythonを書いているぞ!')
            print(f'お前は{rankList[i+1]}パイソニスタだ!')
            print('ごちゃごちゃ考えるな。1行でもコードを書け!')
            break

# データの書き込み。いつ何行書いていたかの記録をとるため。
fileWrite(allLines)

Python初心者・入門者のモチベーションのために

さあPythonを勉強しようとはじめて見たものの、最初のうちは成果がわかりにくい面があります。
Pythonの本を買って学習するPython学習者が簡単にかたちに残せる方法はないかなと思って書いたのがpyroad.pyです。

使い方は至って簡単です。
Pythonを学習すると.pyで終わるPythonのファイルを練習でたくさん書くことになると思います。そのPythonファイルをたくさん書くフォルダにpyroad.pyを置いて下さい。

あなたが書いた全ての.pyファイルの行数をカウントしてくれます。その結果は、pyroad.txtに保存されます。もちろんシステム全体の.pyファイルの行数を数えるわけではなく、pyroad.pyを置いたフォルダ以下の.pyファイルの行数カウントとなります。

pyroad.pyの実行

実行は以下のようにします。

$ python pyroad.py

たとえば以下のように出力します。

1449行Pythonを書いているぞ!
お前は一等兵パイソニスタだ!
ごちゃごちゃ考えるな。1行でもコードを書け!

pyroad.pyでは1000行以上2000行未満は一等兵パイソニスタの扱いなので、このようになります。

Pythonに限らずプログラミングの勉強というのは、まずは書くことです。サンプルコードなどは何も考えないくらいのレベルでどんどん書きましょう。最初のうちはわからなくてもわかるようになることもありますし、理解しながらできるならそれに越したことはありません。もし理解できなくても、書いて書いて突き進んでみることをおすすめします。

なので、pyroad.pyでは「1行でもコードを書け!」と激励するようにしました。

pyroad.pyを実行すると、pyroad.txtが作成されて行数と日時が書き込まれます。
上の例で言いますと、このような感じです。2018年3月13日21時25分58秒の時点で、pyroad.pyがあるフォルダ以下の.pyファイルの行数は1449行という記録です。

1449,2018,3,13,21,25,58

Pythonを書くほど階級が上がる

Pythonを書けば書くほど階級が上がるようにしました。

基準は.pyファイルの行数です。細かいことは気にせず、単純に行数としました。

標準のpyroad.pyの階級システムで物足りなければ、自分なりの行数設定に変更して下さい。levelLinesListを編集するだけです。
階級は軍隊の役職を参考にしましたが、適宜変えても面白いかもしれません(「大将軍」など)。

python pyroad.pyと実行すると、pyroad.txtというテキストファイルが作成されます。
これは実行した時の自分の行数と日時が書き込まれます。

過去のいつ実行してその時は何行だったか記録するためです。
最初に実行した時は100行だったのに、今は5000行になってるとわかると、ちゃんと自分は勉強してPythonを書いたんだなと実感できることでしょう。
なんでもやった成果が目に見えないと続かないものです。
何かPythonでゲームが作れたりサービスが作れてかたちにできることはとても素晴らしいことですが、まず誰にでもできることと言ったらPythonを書くことです。

なにを差し置いてもPythonを書くという行動が必要で、その行動を支えることができる報酬体系が最も単純にできればと思った次第です。

Pythonを書きまくりましょう!