有没有办法在Python中列出所有可用的驱动器号?

或多或less它在锡上说的是:在Python中有一种(简单的)方式来列出所有当前在Windows系统中使用的驱动器号?

(我的google-fu似乎让我失望了。)

有关:

  • 枚举Windows中的所有可用驱动器号 (C ++ / Win32)

Solutions Collecting From Web of "有没有办法在Python中列出所有可用的驱动器号?"

import win32api drives = win32api.GetLogicalDriveStrings() drives = drives.split('\000')[:-1] print drives 

改编自http://www.faqts.com/knowledge_base/view.phtml/aid/4670

如果没有使用任何外部图书馆,如果这对你很重要:

 import string from ctypes import windll def get_drives(): drives = [] bitmask = windll.kernel32.GetLogicalDrives() for letter in string.uppercase: if bitmask & 1: drives.append(letter) bitmask >>= 1 return drives if __name__ == '__main__': print get_drives() # On my PC, this prints ['A', 'C', 'D', 'F', 'H'] 

Microsoft Script Repository包含了这个可能有用的配方 。 我没有一个Windows机器来测试它,所以我不知道你是否想要“名称”,“系统名称”,“卷名称”,或者别的什么东西。

那些看起来更好的答案。 这是我的ha牙

 import os, re re.findall(r"[AZ]+:.*$",os.popen("mountvol /").read(),re.MULTILINE) 

对RichieHindle的回答略微提了一下, 这不是很好,但你可以让窗口来做实际的字母表的工作

 >>> import ctypes >>> buff_size = ctypes.windll.kernel32.GetLogicalDriveStringsW(0,None) >>> buff = ctypes.create_string_buffer(buff_size*2) >>> ctypes.windll.kernel32.GetLogicalDriveStringsW(buff_size,buff) 8 >>> filter(None, buff.raw.decode('utf-16-le').split(u'\0')) [u'C:\\', u'D:\\'] 

在Google上找到这个解决方案,从原来的版本稍微修改 看起来非常pythonic,不需要任何“异国情调”的进口

 import os, string available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)] 

我写了这段代码:

 import os drives = [ chr(x) + ":" for x in range(65,90) if os.path.exists(chr(x) + ":") ] 

它基于@Barmaley的答案,但是不使用string模块的好处是,如果你不想使用它。 它也适用于我的系统,不像@ SingleNegationElimination的答案。

在Windows上,你可以做一个os.popen

 import os print os.popen("fsutil fsinfo drives").readlines() 

基于@RichieHindle的更优化的解决方案

 def get_drives(): drives = [] bitmask = windll.kernel32.GetLogicalDrives() letter = ord('A') while bitmask > 0: if bitmask & 1: drives.append(chr(letter) + ':\\') bitmask >>= 1 letter += 1 return drives 

这是我的更高性能的方法(可能会更高):

 >>> from string import ascii_uppercase >>> reverse_alphabet = ascii_uppercase[::-1] >>> from ctypes import windll # Windows only >>> GLD = windll.kernel32.GetLogicalDisk >>> drives = ['%s:/'%reverse_alphabet[i] for i,v in enumerate(bin(GLD())[2:]) if v=='1'] 

没有人真的使用python的表演功能…

是的,我不遵循Windows标准路径约定('\\')…
在我所有使用python的年代里,我没有任何地方使用“/”的问题,并且在我的程序中使它成为标准。

由于我没有win32api安装在我的笔记本电脑领域我使用这个解决方案使用wmic:

 import subprocess import string #define alphabet alphabet = [] for i in string.ascii_uppercase: alphabet.append(i + ':') #get letters that are mounted somewhere mounted_letters = subprocess.Popen("wmic logicaldisk get name", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) #erase mounted letters from alphabet in nested loop for line in mounted_letters.stdout.readlines(): if "Name" in line: continue for letter in alphabet: if letter in line: print 'Deleting letter %s from free alphabet %s' % letter alphabet.pop(alphabet.index(letter)) print alphabet 

或者你可以从这两个列表中获得差异,就像这个更简单的解决方案(在启动wmic子进程之后作为mounted_letters):

 #get output to list mounted_letters_list = [] for line in mounted_letters.stdout.readlines(): if "Name" in line: continue mounted_letters_list.append(line.strip()) rest = list(set(alphabet) - set(mounted_letters_list)) rest.sort() print rest 

这两个解决方案都是类似的快速,但我猜集合清单是由于某种原因,是吗?

作为类似任务的一部分,我还需要获取一个免费的驱动器盘符。 我决定我想要最高的可用信件。 我首先更习惯性地写出来,然后把它揉成一行,看它是否有意义。 像列表解析一样棒,我喜欢为此unused=set(alphabet)-set(used)unused=set(alphabet)-set(used)而不是必须做unused = [a for a in aphabet if a not in used] 很酷的东西!

 def get_used_drive_letters(): drives = win32api.GetLogicalDriveStrings() drives = drives.split('\000')[:-1] letters = [d[0] for d in drives] return letters def get_unused_drive_letters(): alphabet = map(chr, range(ord('A'), ord('Z')+1)) used = get_used_drive_letters() unused = list(set(alphabet)-set(used)) return unused def get_highest_unused_drive_letter(): unused = get_unused_drive_letters() highest = list(reversed(sorted(unused)))[0] return highest 

单线:

 def get_drive(): highest = sorted(list(set(map(chr, range(ord('A'), ord('Z')+1))) - set(win32api.GetLogicalDriveStrings().split(':\\\000')[:-1])))[-1] 

我也选择使用map / range / ord / chr使用字符串的字母表,因为部分字符串已被弃用。