2009-05-05 77 views

回答

48
import win32api 

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

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

+0

太棒了。工作完美。 – 2009-05-12 03:14:53

+0

我刚刚在2.6版本中试过,并在最后得到了一个额外的空字符串。还是一个很好的答案。 – 2009-06-05 19:47:46

+0

@Mark:编辑修复 – Claudiu 2010-03-27 03:54:28

50

无使用任何外部库,如果这对你很重要:

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'] 
+0

任何不使用的原因string.lowercase或string.ascii_lowercase而不是string.letters [len(string.letters)/ 2:]? – 2009-05-06 02:02:26

+0

@John:没有理由 - 谢谢你的建议,现在改为string.uppercase(因为对于驱动器盘符,我更喜欢大写字母,不知道为什么是8-) – RichieHindle 2009-05-06 08:03:58

6

那些看起来像更好的答案。这里是我的hackish克鲁夫特

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

Riffing一个上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:\\'] 
8

Microsoft Script Repository包括this recipe这可能有助于实际信件的工作。虽然我没有Windows机器来测试它,所以我不确定是否需要“名称”,“系统名称”,“卷名称”或其他内容。

0

由于我没有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 

这两种解决方案都类似地很快,但我猜集合列表是更好的,由于某种原因,对吗?

0

作为类似任务的一部分,我还需要获取一个免费的驱动器盘符。我决定我想要最高的可用信件。我首先更习惯性地写出来,然后将它揉成一行,看看它是否有意义。真棒列表解析是我喜欢为此设置: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] 

我也使用地图/范围/ ORD /字符并且使用串因为串的部分被弃用选择的字母表。

4

在Google上找到此解决方案,从原始版本稍作修改。似乎很符合Python和不需要任何“性趣”进口

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

我写这段代码:

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

它是基于@ Barmaley的答案,但有没有使用string 的优势模块,以防你不想使用它。它也适用于我的系统,不像@ SingleNegationElimination的答案。

1

基于@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 
1

这里更多的最优解是我的更高性能的方法(很可能会更高):

>>> 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的表演featurability ...

是的,我不遵循Windows标准路径约定('\\')...
在我所有使用python的年份中,没有任何地方使用'/'路径的问题,并已在我的程序中达到标准。

2

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

import os 
print os.popen("fsutil fsinfo drives").readlines() 
相关问题