57270


Pythonで作成したソースコードのステップ数を数えるため、空行を除く行数をカウントしたいと考えています。  
複数のフォルダにソースコードがあるため、以下のようなバッチを作成しました。

[code]

    @echo off
    
    for /r %~dp0 /f "delims=" %%a in (*.py) do (
      find /c /v "" %%a >> pycount_result.csv   
    )
    
[/code]

しかし、デリミタ"delims="の記述が違反していると返ってきて、実行できません。  
どのように記述したらよいか、ご存知の方はご教示をお願いします。

実行環境：Windows10Pro

また、コメント行（#で始まる行）も取り除く方法もあれば、ご教示をお願いします。


CC BY-SA 4.0
2019-08-06T06:41:16.917
57199
2019-08-09T08:21:19.200
32891
question
batch-file
バッチファイルでPythonのソースコードの行数をカウントしたい。


バッチファイルでエラーが発生する理由は、`/r`で再帰的にファイルを取得するコードと`/f`でファイルの中身を読み込むコードか混在しているためです。

下記のサンプルコードのように多重ループでファイルを読み込むよう改修することで、エラーを発生させずに再帰的にファイルの行数を取得することができます。

**count.bat**

[code]

    @echo off
    
    rem 遅延評価することでecho !c!を有効にしている
    setlocal enabledelayedexpansion
    
    rem 再帰的にpythonファイルを取得して%fに代入
    for /r %~dp0 %%f in (*.py) do (
      rem 単純に各行を読み込んで行数を出力する
      set c=0
      for /f "delims=" %%a in (%%f) do (
        set /a c=c+1
      )
      echo !c!
      rem コメントが存在しない行をカウントする(質問の意図は満たしていない)
      find /c /V "#" %%f
    )
    
[/code]

しかし上記の方法ではコメント行を削除する処理ができていません。  
(`find /c /V "#" %%f`では、末尾コメントを含めてコメントのある行を除外してしまいます)  
python 3.5 以降ならば下記のコードで行コメントを除く行数を取得できます。

**count.py**

[code]

    import glob
    
    for f in glob.glob(r".\**\*.py", recursive=True):
        c = sum([1 for l in open(f) if not l.strip().startswith("#")])
        print('{}: {} lines'.format(f, c))
    
[/code]

この処理で行コメントは除外してカウントできますが、複数行のブロックコメントを除外できません。  
そのため @kunif さんが示されているようにpythonと外部のプラグインを併用することをお勧めいたします。


CC BY-SA 4.0
2019-08-06T08:35:11.960
57202
2019-08-06T08:47:56.800
2019-08-06T08:47:56.800
3060
9820
57199
answer


openのオプションを追加すれば解決しました。ありがとうございました。

[code]

    #! /usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import glob
    
    for f in glob.glob(r".\**\*.py", recursive=True):
        c = sum([1 for l in open(f,encoding="utf-8_sig") if not l.strip().startswith("#")])
        print('{}: {} lines'.format(f, c))
    
    
    
[/code]


CC BY-SA 4.0
2019-08-09T08:21:19.200
57270
2019-08-09T08:21:19.200
32891
57199
answer