鱼C论坛

 找回密码
 立即注册
查看: 674|回复: 2

[已解决]求大佬解惑

[复制链接]
发表于 2023-11-21 08:30:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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等于本代码路径是就会跳过本源代码文件吗?
那为什么我在本文件中增加代码 最后输出的结果也会跟着变动呢?
最佳答案
2023-11-21 08:30:38
__file__ 是一个内置变量,它包含了当前执行的脚本的文件名。在给定的代码中, if str(each) == __file__  这行代码的意思是,如果当前遍历到的文件路径等于当前执行的脚本文件的路径,就跳过这个文件,不对其进行处理。

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

解决这个问题的方法是不要在递归调用中改变 p 的值,而是创建一个新的变量来保存子目录的路径,这样就不会影响到 __file__ 的比较结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-21 08:30:38 | 显示全部楼层    本楼为最佳答案   
__file__ 是一个内置变量,它包含了当前执行的脚本的文件名。在给定的代码中, if str(each) == __file__  这行代码的意思是,如果当前遍历到的文件路径等于当前执行的脚本文件的路径,就跳过这个文件,不对其进行处理。

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

解决这个问题的方法是不要在递归调用中改变 p 的值,而是创建一个新的变量来保存子目录的路径,这样就不会影响到 __file__ 的比较结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

懂了  谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 14:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表