或多或少它在锡上说的是什么:在Python中有没有一种(简单)的方式来列出所有当前正在使用的windows系统中的驱动器号?有没有办法在Python中列出所有可用的驱动器号?
(我的谷歌福似乎已经让我失望了这一点。)
相关:
或多或少它在锡上说的是什么:在Python中有没有一种(简单)的方式来列出所有当前正在使用的windows系统中的驱动器号?有没有办法在Python中列出所有可用的驱动器号?
(我的谷歌福似乎已经让我失望了这一点。)
相关:
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']
任何不使用的原因string.lowercase或string.ascii_lowercase而不是string.letters [len(string.letters)/ 2:]? – 2009-05-06 02:02:26
@John:没有理由 - 谢谢你的建议,现在改为string.uppercase(因为对于驱动器盘符,我更喜欢大写字母,不知道为什么是8-) – RichieHindle 2009-05-06 08:03:58
那些看起来像更好的答案。这里是我的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:\\']
的Microsoft Script Repository包括this recipe这可能有助于实际信件的工作。虽然我没有Windows机器来测试它,所以我不确定是否需要“名称”,“系统名称”,“卷名称”或其他内容。
由于我没有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 = [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 /字符并且使用串因为串的部分被弃用选择的字母表。
在Google上找到此解决方案,从原始版本稍作修改。似乎很符合Python和不需要任何“性趣”进口
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的答案。
基于@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的表演featurability ...
是的,我不遵循Windows标准路径约定('\\')...
在我所有使用python的年份中,没有任何地方使用'/'路径的问题,并已在我的程序中达到标准。
在Windows中,你可以做一个os.popen
import os
print os.popen("fsutil fsinfo drives").readlines()
太棒了。工作完美。 – 2009-05-12 03:14:53
我刚刚在2.6版本中试过,并在最后得到了一个额外的空字符串。还是一个很好的答案。 – 2009-06-05 19:47:46
@Mark:编辑修复 – Claudiu 2010-03-27 03:54:28