在所有驱动器中搜索文件

时间:2015-07-30 09:30:08

标签: python windows file path

我有一个文件的名称,我想在任何驱动器上找到它。我可以使用递归搜索,但我需要一个根目录开始。对于大多数计算机,根是“C:\”。但也有一些改变了这个字母,或者有一些改变了一个字母(例如C,D ......)。

所以,我需要找到一种方法来了解计算机中的所有驱动器,因此我可以搜索每个驱动器。我需要在没有用户输入的情况下以编程方式找到这些字母。

我知道我可以使用“diskpart”,但它需要管理员访问权限,这是我的代码所不具备的。还有“wmic”,但我不知道计算机是否在PATH中有正确的文件夹。

所以,问题是如何在计算机中进行递归搜索,我不知道驱动器的字母或有多少?或者是否有另一种方法可以在计算机中找到文件的路径?

2 个答案:

答案 0 :(得分:1)

我有一个解决方案,要求您以管理员身份运行,但不要求您安装任何其他工具。然后,我有一个替代的,凌乱的解决方案,即使没有任何这些特权,您也可以运行。我将从更清洁的人开始。

此脚本将为您找到驱动器:

import subprocess

driveStr = subprocess.check_output("fsutil fsinfo drives")
driveStr = driveStr.strip().lstrip('Drives: ')
drives = driveStr.split()

基本上,fsutil fsinfo drives是一个命令行命令,它将返回计算机上现有驱动器的字母。因此,您可以使用check_output获取该结果,然后删除不必要的字符,因为它将返回类似'\r\nDrives: C:\\ D:\\ \r\n'的字符串。然后你可以拆分列表,你会得到一个像这样的驱动器列表:

['C:\\', 'D:\\']

然后,您可以遍历这些驱动器以递归方式搜索文件。

import os

def find_file(target, folder):
    for f in os.listdir(folder):
        path = os.path.join(folder, f)
        if os.path.isdir(path):
            result = find_file(target, path)
            if result is not None:
                return result
            continue
        if f == target:
            return path

此函数基本上会遍历它提供的文件夹中的每个文件,它首先检查文件是否是isdir的文件夹,并在它找到的任何文件夹上递归运行。如果它不是文件夹,它将检查名为target的文件并在找到时返回其路径。您可以非常简单地将这两个部分组合在一起:

for drive in drives:
    filepath = find_file(target, drive)
    if filepath is not None:
        break

但是,如果您无法以管理员身份运行,则还有另一种不那么好的方法。基本上你可以遍历所有可能的驱动器名称并检查它们是否存在,如下所示:

drives = ['{}:\\' for letter in 'CDEFGHIJKLMNOPQRSTUVWXYZ']
for drive in drives:
    if os.path.isdir(drive):
        filepath = find_file(target, drive)
        if filepath is not None:
            break

这将检查每个驱动器是否作为目录存在并搜索每个驱动器。请注意,这将包括网络路径,我相信USB /外部硬盘驱动器,而替代方法则不然。

答案 1 :(得分:-3)

如果我理解正确,您就知道该文件的名称。

使用os.path.abspath('myfile.txt')应该返回完整路径。

之后,您可以使用os.path.dirname仅获取目录。

根据文档,os.path应该是跨平台的:https://docs.python.org/3/library/os.path.html#module-os.path但我还没有在Windows上尝试过。