xiaozhuzhu12138 发表于 2023-11-21 08:30:33

求大佬解惑

from pathlib import Path

def get_files(p,files):
    for each in p.iterdir():
      if str(each) == __file__: #__file__显示本文件所在的路径
            continue
      if each.is_file() and each.suffix == '.py':
            files.append(each)
      if each.is_dir():
            p = each
            get_files(p,files)

    return files

def count_lines(files):
    lines = 0
    for each in files:
      with open(each,"r",errors="ignore") as f:
            t = f.readlines()
            lines += len(t) - t.count("\n")#减去空行,查找只有\n元素数量
    return lines

p = Path.cwd()
files = []

files = get_files(p,files)
print(f"一共有{count_lines(files)}行代码")


      
有大佬解释一下          if str(each) == __file__: #__file__             continue 这个意思不是当变量each等于本代码路径是就会跳过本源代码文件吗?
那为什么我在本文件中增加代码 最后输出的结果也会跟着变动呢?

isdkz 发表于 2023-11-21 08:30:38

__file__ 是一个内置变量,它包含了当前执行的脚本的文件名。在给定的代码中, if str(each) == __file__这行代码的意思是,如果当前遍历到的文件路径等于当前执行的脚本文件的路径,就跳过这个文件,不对其进行处理。

然而,问题出在递归调用 get_files 函数时,当遍历到子目录时, p 被更新为子目录的路径,这样会影响到 __file__ 的比较结果。因为 __file__ 是指向最初执行的脚本文件的路径,而不是当前正在遍历的文件的路径。

解决这个问题的方法是不要在递归调用中改变 p 的值,而是创建一个新的变量来保存子目录的路径,这样就不会影响到 __file__ 的比较结果。

xiaozhuzhu12138 发表于 2023-11-21 08:37:12

isdkz 发表于 2023-11-21 08:30
__file__ 是一个内置变量,它包含了当前执行的脚本的文件名。在给定的代码中, if str(each) == __file__...

懂了谢谢大佬
页: [1]
查看完整版本: 求大佬解惑