使用Python在所有驱动器中搜索文件

8

我使用Python,并需要一个函数或库,在我提供文件名称(如Windows中的F3),可以在所有驱动器中搜索我的文件,即在计算机的所有文件夹中进行搜索。

操作系统为Windows,本地驱动器,我编写了以下代码:

import os
import win32api
paths = 'D:/'
def dir_list_folder(paths):
    for folderName in os.listdir(paths):
        if (folderName.find('.') == -1):
            folderPath = os.path.join(paths,folderName );
            dir_list_folder(folderPath);
        else:
            print ('Files is :'+ folderName );

我的IT操作得到了不错的结果,但是某些类型会出现错误。如果我不需要在Zip或RAR文件中搜索,我该怎么做呢?

3个回答

11

在 Windows 上,最好使用 os.walk 函数。 os.walk 返回一个递归遍历源目录树的生成器。下面的示例展示了正则表达式搜索。

import os
import re
import win32api

def find_file(root_folder, rex):
    for root,dirs,files in os.walk(root_folder):
        for f in files:
            result = rex.search(f)
            if result:
                print os.path.join(root, f)
                break # if you want to find only one

def find_file_in_all_drives(file_name):
    #create a regular expression for the file
    rex = re.compile(file_name)
    for drive in win32api.GetLogicalDriveStrings().split('\000')[:-1]:
        find_file( drive, rex )


find_file_in_all_drives( 'myfile\.doc' )

一些注意事项:

  1. 我使用正则表达式来搜索文件。为此,我提前编译了RE,然后将其作为参数传递。记得规范化表达式 - 特别是如果文件名来自恶意用户。
  2. win32api.GetLogicalDriveStrings返回一个由所有驱动器分隔的字符串。拆分它,然后切片出最后一个元素。
  3. 在遍历时,您可以从“dirs”中删除不需要的文件夹,例如“.git”或“.cvs”。例如,请参阅os.walk.__doc__
  4. 为了使示例简短,我没有传播“found”。如果您要打印所有文件,请删除break。如果要在找到第一个文件后停止,请将break传播到find_file_in_all_drives

2
import os
az = lambda: (chr(i)+":\\" for i in range(ord("A"), ord("Z") + 1))
for drv in az():
    for root, dirs, files in os.walk(drv):
        process_the_stuff()

1

您需要指定驱动器,例如C驱动器。

def findall(directory):
    files=os.listdir(directory)
    for fl in files:
        path=os.path.join(directory,fl)
        if os.path.isdir(path):
            findall(path)
        else:
            dosomethingwithfile(path)
    return

基本上,您遍历文件树。但是您必须将驱动器作为根目录传递给此方法。例如:findall('c:/')


@specialscope 在 for 行后添加 path = os.path.join(directory, fl),并将所有的 directory+'/'+fl 替换为 path - glglgl
它可以在文件夹中进行良好的搜索,但也会搜索文件内部,如果遇到文件,则应停止搜索。 - user1223495

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接