我有一个文件的名称,我想在任何驱动器上找到它。我可以使用递归搜索,但我需要一个根目录开始。对于大多数计算机,根是“C:\”。但也有一些改变了这个字母,或者有一些改变了一个字母(例如C,D ......)。
所以,我需要找到一种方法来了解计算机中的所有驱动器,因此我可以搜索每个驱动器。我需要在没有用户输入的情况下以编程方式找到这些字母。
我知道我可以使用“diskpart”,但它需要管理员访问权限,这是我的代码所不具备的。还有“wmic”,但我不知道计算机是否在PATH中有正确的文件夹。
所以,问题是如何在计算机中进行递归搜索,我不知道驱动器的字母或有多少?或者是否有另一种方法可以在计算机中找到文件的路径?
答案 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上尝试过。