2201_75335496 2024-08-04 15:50 采纳率: 76.5%
浏览 0

python遍历文件时异常退出

python我尝试使用以下代码遍历电脑所有硬盘文件,可是在测试多次后程序会莫名其妙中断并强制退出,使用sys.stderr也没捕获到任何信息,且每次扫描到的位置为aptana的目录和回收站文件时(同时)才发生崩溃(应该是巧合),每次运行后1秒左右就崩溃(没扫描完),请问如何解决?

fileAllPath = []
def getDiskList():
    l = []
    for c in string.ascii_uppercase:
        disk = c + ':\\'
        if os.path.isdir(disk):
            l.append(disk)
            #drive_node = tree_view.insert(pc_node, 'end', text=disk, image=drive_image)
    return l
DONE = False
def getFileTree():
    def getOneDiskTree(i):
        global DONE,threadnum
        threadnum = 0
        t = []
        def walkDir(p,filenames,sst):
            global threadnum
            threadnum += 1
            for filename in filenames:
                fileAllPath.append(p + os.sep + filename)
                print("\n" + p + os.sep + filename,end = "")
            t[sst] = True
            threadnum -= 1
        for p, dirnames, filenames in os.walk(i):
            t.append(False)
            sst = len(t) - 1
            if threadnum < 900:
                td(target = walkDir,args = (p,filenames,sst)).start()
            else:
                walkDir(p,filenames,sst)
        while not any(t):
            time.sleep(0.5)
        DONE = True
    t = time.time()
    path = getDiskList()
    for i in path:
        td(target = getOneDiskTree,args = (i,)).start()
    while not DONE:
        time.sleep(0.5)
    return time.time() - t
t = getFileTree()
with open("./t.txt","w",encoding = "utf-8") as f:
    f.write(str(t) + "\n" + str(fileAllPath))
os._exit(0)
  • 写回答

1条回答 默认 最新

  • 专家-司宇[在线] 2024-08-04 15:50
    关注

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

    这个问题涉及到Python程序在处理大数量文件时可能会遇到的问题,这些文件可能存储了大量的系统信息和日志数据,这可能导致程序在处理这些文件时出现问题。

    要解决这个问题,我们可以采取以下几个步骤:

    步骤 1: 检查是否有权限访问文件

    确保用户有足够的权限访问文件路径。如果文件位于特定用户的主驱动器上,例如C:,并且不是隐藏文件,则通常具有足够的权限读取。但是,对于其他类型的文件,特别是那些包含敏感信息的文件,应该检查用户是否拥有必要的权限。

    # 确保用户有适当的权限
    if not os.access(path, os.R_OK):
        raise PermissionError("User does not have access to the directory")
    

    步骤 2: 使用更有效的文件路径处理方式

    考虑使用相对路径,这样可以减少不必要的文件打开和关闭操作,从而提高性能。

    def get_disk_list():
        relative_path = r"C:\"
        return [relative_path + drive + '\\*' for drive in os.listdir()]
    

    步骤 3: 使用多线程或进程池

    如果你的程序正在处理大量文件,那么可以考虑使用多线程或多进程来分块处理文件。这种方法可以有效地利用多核处理器的优势,并降低单个进程等待I/O完成的时间。

    import threading
    
    def process_file(path):
        with open(path, 'r') as file:
            # 处理文件内容...
            pass
    
    def process_directory(path):
        threads = []
        for root, dirs, files in os.walk(path):
            for name in files:
                full_path = os.path.join(root, name)
                t = threading.Thread(target=process_file, args=(full_path,))
                t.start()
                threads.append(t)
    
    def main():
        all_files = get_disk_list()
        for path in all_files:
            process_directory(path)
    
    if __name__ == "__main__":
        main()
    

    步骤 4: 打印进度条

    虽然这不是一个根本性的解决方案,但在某些情况下,打印出当前已经处理了多少个文件也可以提供一些有用的信息。

    print(f"已处理 {len(all_files)} 文件...")
    

    结论

    通过以上步骤,你应该能有效处理文件列表中的文件。如果你仍然遇到问题,建议检查文件类型、权限以及程序的实现细节。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 8月4日
  • 创建了问题 8月4日

悬赏问题

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