92397


対象とするディレクトリ内の複数のjavaファイルを探索していき、定義されているクラス名を所得したいです。例えば、target_dir に Car.java
と Train.java
がある場合、「Car」と「Train」というクラス名を受け取りたいです。また、単純にファイル名をクラス名として返すのではなく、一つずつファイルを探索していく形を取りたいです。

作成してみたのですが、一つのjavaファイルしか読みこむことができず、解決策が思い浮かばない状況です。修正箇所及びより良い実装方法がございましたら、ご教授いただけると幸いです。

[code]

    import os
    for root, dirs, files in os.walk(top='./target_dir'):
      for file in files:
        if not file.lower().endswith(('.java')):
           continue
    
        filePath = os.path.join(root, file)
    
        #一行ずつ読み込む
        with open(filePath) as f:
            lines = f.readlines()
    
        #改行は省く
        lines = [line.rstrip('\n').split() for line in lines]
        print(lines)
        
        #classの記述の後に続くコードを表示させる
        for i in range(len(lines)):
            if "class" in lines[i]:
                classline = lines[i]
        print(classline)
        print(classline[classline.index("class")+1])
    
[/code]

[![エラー画面](https://i.stack.imgur.com/w2CSB.png)](https://i.stack.imgur.com/w2CSB.png)


CC BY-SA 4.0
2022-11-23T18:33:54.547
92396
2022-11-24T03:16:35.807
2022-11-24T03:16:35.807
3060
55562
question
python
Pythonで対象ディレクトリの複数のjavaファイルを探索し、定義されているクラス名を取得したい


正規表現を使ってクラス名を列挙する例です。

**サンプルコード**

[code]

    import glob
    import re
    
    dir_path = r"./target_dir" 
    pattern = re.compile(r"\s?class\s+(\w+)")
    
    for path in glob.glob(rf"{dir_path}/*.java"):
        with open(path, "r", encoding="sjis") as f:
            s = f.read()
            for m in re.finditer(pattern, s):
                class_name = m.group(1)
                print(f'{class_name} クラスが"{f.name}"で見つかりました。')
    
[/code]

  * ファイル内の複数のクラスを抽出できます。
  * フォルダの再帰処理はしません。
  * コメント行の判別をしません。
  * ファイルのエンコーディングをシフトJISに決め打ちで処理します。


CC BY-SA 4.0
2022-11-24T02:54:28.803
92397
2022-11-24T02:54:28.803
9820
92396
answer