首页 > 解决方案 > 如何获取包含子目录的目录中文件的文件路径?

问题描述

以前回答过,但流行答案的代码在 Windows 上不起作用。

我正在学习 python 并尝试编写一个 scipt 来计算 .NET 项目中的代码行数。

使用我的目录结构,它发现的不是所有文件,而是少数文件,该项目位于此处:

https://github.com/stax76/mpv.net

脚本如下所示:

import os

root = r"C:\Users\frank\Daten\Projekte\CS\mpv.net"

allLines = []

for path, subdirs, files in os.walk(root):
    for name in files:
        filepath = os.path.join(path, name)

        if not filepath.endswith( ('.cs','.vb') ):
            break

        with open(filepath) as f:
            lines = f.read().splitlines()

            for line in lines:
                allLines.append(line)

print(len(allLines))

标签: pythonwindowsfilesystems

解决方案


在您的情况下,问题是break,如果文件不以 .cs 或 .vb 结尾,您只需跳过目录,您需要将其更改continue为如下:

import os

root = r"C:\Users\frank\Daten\Projekte\CS\mpv.net"

allLines = []

for path, subdirs, files in os.walk(root):
    for name in files:
        filepath = os.path.join(path, name)

        if not filepath.endswith( ('.cs','.vb') ):
            continue

        with open(filepath) as f:
            lines = f.read().splitlines()

            for line in lines:
                allLines.append(line)

print(len(allLines))

此代码还可以得到改进:

import os

root = r"C:\Users\frank\Daten\Projekte\CS\mpv.net"

allLines = 0

for path, subdirs, files in os.walk(root):

    for name in files:

        if not filepath.endswith( ('.cs','.vb') ):
            continue

        filepath = os.path.join(path, name)

        with open(filepath) as f:
            lines += len(f.read().splitlines())

print(allLines)

推荐阅读