2201_75335496 2024-06-17 21:48 采纳率: 76.5%
浏览 1
已结题

py程序获取到的文件列表出现问题

今天写树形文件列表时发现一个奇怪的问题,明明C盘有很多文件,但是程序只显示他自己目录下的文件(该程序位于c盘)

img


代码:

#在文件夹中添加节点
def insert_child_items(parent_node):
    path = node_path(parent_node)
    dirlist = []
    filelist = []
    if os.path.isdir(path):
        try:
            dir_items = os.scandir(path)
            for item in dir_items:
                if item.name == "$RECYCLE.BIN" or item.name == "$Recycle.Bin":
                    tree_view.insert(parent_node, 'end', text=item.name, image=recycle_image)
                else:
                    if item.is_dir() and ('.$'.find(item.name[0])<0):
                        dirlist.append(item.name)
                    else:
                        if not "$" in item.name:
                            filelist.append(item.name)
                        else:
                            dirlist.append(item.name)
            #添加节点
            dirlist.sort()
            filelist.sort()
            for item in dirlist:
                tree_view.insert(parent_node, 'end', text=item, image=folder_image)
            for item in filelist:
                tree_view.insert(parent_node, 'end', text=item, image=file_image)
        except Exception as e:
            print(e)

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-17 21:48
    关注

    引自免费微信小程序:皆我百晓生

    从描述来看,你的Python脚本在尝试列出C盘根目录下的所有文件和文件夹时,似乎只列出了当前脚本所在目录的文件。这通常是因为os.scandir()默认扫描的是当前工作目录,而非你可能期望的某个特定目录。

    为了解决这个问题,确保你在调用os.scandir()时指定了正确的路径。在你的代码中,path变量应当被设置为你要扫描的目录的完整路径。例如,如果你想列出C盘根目录的所有文件和文件夹,你应该将path设置为'C:\\'

    以下是修改后的代码段,用于明确指定C盘作为扫描的目标目录:

    import os
    
    # 在文件夹中添加节点
    def insert_child_items(parent_node):
        # 明确指定C盘作为扫描的目标目录
        path = 'C:\\'
        
        dirlist = []
        filelist = []
        if os.path.isdir(path):
            try:
                dir_items = os.scandir(path)
                for item in dir_items:
                    if item.name == "$RECYCLE.BIN" or item.name == "$Recycle.Bin":
                        tree_view.insert(parent_node, 'end', text=item.name, image=recycle_image)
                    else:
                        if item.is_dir() and ('.$'.find(item.name[0])<0):
                            dirlist.append(item.name)
                        else:
                            if not "$" in item.name:
                                filelist.append(item.name)
                            else:
                                dirlist.append(item.name)
                # 添加节点
                dirlist.sort()
                filelist.sort()
                for item in dirlist:
                    tree_view.insert(parent_node, 'end', text=item, image=folder_image)
                for item in filelist:
                    tree_view.insert(parent_node, 'end', text=item, image=file_image)
            except Exception as e:
                print(e)
    

    需要注意的是,这段代码中的tree_viewrecycle_imagefolder_imagefile_image应该是你界面中用于展示文件和文件夹的组件和图像资源,它们不在标准库中,因此未在此处定义。请确保这些变量已经在你的代码其他部分正确初始化。

    另外,由于os.scandir()返回的是一个迭代器,它会按需加载目录项,这通常比os.listdir()更高效,尤其是处理大目录时。但这也意味着你需要在遍历完所有条目后关闭这个迭代器,以释放系统资源。你可以在循环结束后加入dir_items.close()来实现这一点。虽然在某些情况下Python的垃圾回收机制会自动清理,但在处理大型目录时显式关闭是一个好习惯。修改后的代码如下:

    ...
    for item in dir_items:
        ...
    # 确保关闭scandir()返回的迭代器
    dir_items.close()
    

    这样修改后,你的脚本应该能正确地列出C盘根目录下的所有文件和文件夹了。如果仍然遇到问题,检查是否有权限限制阻止脚本读取C盘的某些目录或文件。在Windows上,一些系统目录可能需要管理员权限才能访问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月25日
  • 已采纳回答 6月17日
  • 创建了问题 6月17日

悬赏问题

  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)