有没有办法在Python中列出所有可用的驱动器号?
或多或less它在锡上说的是:在Python中有一种(简单)的方式来列出所有当前在Windows系统中使用的驱动器号?
(我的google-fu似乎让我失望了。)
有关:
- 枚举Windows中的所有可用驱动器号 (C ++ / Win32)
import win32api drives = win32api.GetLogicalDriveStrings() drives = drives.split('\000')[:-1] print drives
如果没有使用任何外部图书馆,如果这对你很重要:
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机器来testing它,所以我不知道你是否想要“名称”,“系统名称”,“卷名称”,或者别的什么东西。
那些看起来更好的答案。 这是我的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上find这个解决scheme,稍作修改。 看起来非常pythonic,不需要任何“异国情调”的import
import os, string available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]
基于@RichieHindle的更优化的解决scheme
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
我写了这段代码:
import os drives = [ chr(x) + ":" for x in range(65,90) if os.path.exists(chr(x) + ":") ]
它基于@Barmaley的答案,但是不使用string
模块的好处是,如果你不想使用它。 它也适用于我的系统,不像@ SingleNegationElimination的答案。
由于我没有win32api安装在我的笔记本电脑领域我使用这个解决scheme使用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
或者你可以从这两个列表中获得差异,就像这个更简单的解决scheme(在启动wmicsubprocess之后作为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
这两个解决scheme都是类似的快速,但我猜集合清单是由于某种原因,是吗?
作为类似任务的一部分,我还需要获取一个免费的驱动器盘符。 我决定我想要最高的信件。 我首先更习惯性地写出来,然后把它揉成一行,看它是否有意义。 就像列表parsing一样棒,我喜欢为此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]
我也select使用map / range / ord / chr使用string的字母表,因为部分string已被弃用。
这是我的更高性能的方法(可能会更高):
>>> 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的表演function…
是的,我不遵循Windows标准path约定('\\')…
在我所有使用python的年代里,我没有任何地方使用“/”的问题,并且使得它在我的程序中是标准的。
在Windows上,你可以做一个os.popen
import os print os.popen("fsutil fsinfo drives").readlines()