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

Python 在所有驱动器中搜索文件,python,windows,file,path,Python,Windows,File,Path,我有一个文件名,我想在任何驱动器上找到它。我可以使用递归搜索,但首先需要根目录。对于大多数计算机,根是“C:\”。但是有些人改变了字母,或者有些人有不止一个字母(例如C,D…) 所以,我需要找到一种方法来了解计算机中的所有驱动器,这样我就可以搜索每一个驱动器。我需要以编程方式查找字母,无需用户输入 我知道我可以使用“diskpart”,但它需要管理员访问,这是我的代码所没有的。还有“wmic”,但我不知道计算机的路径中是否有正确的文件夹 所以,问题是如何在我不知道驱动器字母或驱动器数量的计算机中

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

所以,我需要找到一种方法来了解计算机中的所有驱动器,这样我就可以搜索每一个驱动器。我需要以编程方式查找字母,无需用户输入

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


所以,问题是如何在我不知道驱动器字母或驱动器数量的计算机中进行递归搜索?或者有没有其他方法在计算机中查找文件路径?

如果我理解正确,您知道文件名

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

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


根据文档,os.path应该是跨平台的:但我还没有在Windows上尝试过。

如果我理解正确,您知道文件名

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

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


根据文档,os.path应该是跨平台的:但我没有在Windows上尝试过。

我有一个解决方案,要求您以管理员身份运行,但不要求您安装任何其他工具。然后,我有了一个替代的、混乱的解决方案,您甚至可以在没有任何这些特权的情况下运行它。我先从干净的开始

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

import subprocess

driveStr = subprocess.check_output("fsutil fsinfo drives")
driveStr = driveStr.strip().lstrip('Drives: ')
drives = driveStr.split()
基本上,
fsutil fsinfo drives
是一个命令行命令,它将返回计算机上现有驱动器的字母。因此,您可以使用
检查\u output
获得该结果,然后去掉不必要的字符,因为它将返回类似
“\r\n字符串:C:\\D:\\\r\n”
。然后,您可以拆分该列表,您将有一个驱动器列表,如下所示:

['C:\\', 'D:\\']
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
然后,您可以在这些驱动器上循环以递归方式搜索文件

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
但是,如果您无法以管理员身份运行,那么还有另一种方法不太好。基本上,您可以循环所有可能的驱动器名称,并检查它们是否存在,如下所示:

['C:\\', 'D:\\']
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/外部硬盘驱动器,而替代方法不包括。

我有一个解决方案,要求您以管理员身份运行,但不要求您安装任何其他工具。然后,我有了一个替代的、混乱的解决方案,您甚至可以在没有任何这些特权的情况下运行它。我先从干净的开始

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

import subprocess

driveStr = subprocess.check_output("fsutil fsinfo drives")
driveStr = driveStr.strip().lstrip('Drives: ')
drives = driveStr.split()
基本上,
fsutil fsinfo drives
是一个命令行命令,它将返回计算机上现有驱动器的字母。因此,您可以使用
检查\u output
获得该结果,然后去掉不必要的字符,因为它将返回类似
“\r\n字符串:C:\\D:\\\r\n”
。然后,您可以拆分该列表,您将有一个驱动器列表,如下所示:

['C:\\', 'D:\\']
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
然后,您可以在这些驱动器上循环以递归方式搜索文件

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
但是,如果您无法以管理员身份运行,那么还有另一种方法不太好。基本上,您可以循环所有可能的驱动器名称,并检查它们是否存在,如下所示:

['C:\\', 'D:\\']
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/外部硬盘驱动器,而替代方法不包括。

您可以使用
os.path.abspath('blank')
来计算当前驱动器,它将返回类似
C:/Python27/blank
的路径。但是你想确定什么是多个驱动器吗?嗨,tamird14,我看到你有一个好主意(递归搜索),所以我敢说你的问题是找到HD的字母。我建议你相应地改变你问题的标题。如果安装了win32api并使用,则会有所帮助,例如:
os.getcwd
可以让您访问当前驱动器的字母。@SuperBiasedMan我的目标是找到文件的路径。您可以使用
os.path.abspath('blank')
来计算当前驱动器,它将返回类似
C:/Python27/blank
的路径。但是你想确定什么是多个驱动器吗?嗨,tamird14,我看到你有一个好主意(递归搜索),所以我敢说你的问题是找到HD的字母。我建议你相应地改变你问题的标题。如果安装了win32api并使用,则会有帮助。例如:
os。getcwd
可以让您访问当前驱动器的字母。@SuperBiasedMan我的目标是找到文件的路径。否,OP希望在给定硬盘驱动器的每个文件夹中递归搜索该文件。否,OP希望在给定硬盘驱动器的每个文件夹中递归搜索该文件