복붙노트

[PYTHON] 파이썬에서 사용 가능한 모든 드라이브 문자를 나열하는 방법이 있습니까?

PYTHON

파이썬에서 사용 가능한 모든 드라이브 문자를 나열하는 방법이 있습니까?

주석에서 말하는 것과 같거나 적습니다 : Windows 시스템에서 현재 사용중인 드라이브 문자를 모두 나열하는 Python의 (쉬운) 방법이 있습니까?

(내 google-fu는이 문제를 저를 실망 시켰습니다.)

관련 항목 :

해결법

  1. ==============================

    1.

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

    적응 : http://www.faqts.com/knowledge_base/view.phtml/aid/4670

  2. ==============================

    2.외부 라이브러리를 사용하지 않고 귀하에게 중요한 경우 :

    외부 라이브러리를 사용하지 않고 귀하에게 중요한 경우 :

    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']
    
  3. ==============================

    3.Microsoft 스크립트 저장소에는 도움이 될 수있는이 방법이 포함되어 있습니다. 당신이 "이름", "시스템 이름", "볼륨 이름", 또는 어쩌면 다른 것을 원한다면 나는 확신 할 수 없기 때문에, 윈도우 머신을 테스트 할 필요가 없다.

    Microsoft 스크립트 저장소에는 도움이 될 수있는이 방법이 포함되어 있습니다. 당신이 "이름", "시스템 이름", "볼륨 이름", 또는 어쩌면 다른 것을 원한다면 나는 확신 할 수 없기 때문에, 윈도우 머신을 테스트 할 필요가 없다.

  4. ==============================

    4.그 사람들은 더 나은 대답처럼 보입니다. 여기 내 hackish cruft가있다.

    그 사람들은 더 나은 대답처럼 보입니다. 여기 내 hackish cruft가있다.

    import os, re
    re.findall(r"[A-Z]+:.*$",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:\\']
    
  5. ==============================

    5.Google에서이 솔루션을 찾았습니다. 원본에서 약간 수정되었습니다. 꽤 파이썬스럽고 "이국적인"수입품이 필요하지 않습니다.

    Google에서이 솔루션을 찾았습니다. 원본에서 약간 수정되었습니다. 꽤 파이썬스럽고 "이국적인"수입품이 필요하지 않습니다.

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

    6.@RichieHindle을 기반으로하는보다 최적의 솔루션

    @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
    
  7. ==============================

    7.나는이 코드를 썼다 :

    나는이 코드를 썼다 :

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

    @ Barmaley의 대답을 기반으로하지만 문자열을 사용하지 않는 이점이 있습니다. 모듈을 사용할 수 있습니다. 또한 @ SingleNegationElimination의 대답과 달리 내 시스템에서도 작동합니다.

  8. ==============================

    8.Windows에서는 os.popen을 할 수 있습니다.

    Windows에서는 os.popen을 할 수 있습니다.

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

    9.여기 내 높은 성능 접근법 (아마도 더 높을 수 있습니다) :

    여기 내 높은 성능 접근법 (아마도 더 높을 수 있습니다) :

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

    아무도 실제로 파이썬의 수행 능력을 사용하지 않습니다 ...

    예, Windows 표준 경로 규칙 ( '\\')을 따르지 않습니다 ... 필자는 파이썬을 사용하면서도 경로가 사용되는 곳에서 '/'에 아무런 문제가 없었으며 내 프로그램에서 표준으로 만들었습니다.

  10. ==============================

    10.노트북 분야에 win32api를 설치하지 않았으므로이 솔루션을 wmic를 사용하여 사용했습니다.

    노트북 분야에 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
    

    두 가지 솔루션이 비슷하게 빠르지 만, 세트 목록은 어떤 이유로 더 좋습니다. 맞습니까?

  11. ==============================

    11.유사한 작업의 일환으로 나는 또한 무료 드라이브 문자를 얻어야했습니다. 나는 가장 높은 가용 한 편지를 원한다고 결정했다. 나는 먼저 그것을 더 관용적으로 썼다. 그리고 나서 그것이 여전히 합리적인지를보기 위해 그것을 1 라이너로 크랭크했다. List comprehensions만큼 멋진데, unused = set (alphabet) -set (used) 대신 unused = [aphabet를 사용하지 않을 경우]를 사용해야합니다. 좋은 것!

    유사한 작업의 일환으로 나는 또한 무료 드라이브 문자를 얻어야했습니다. 나는 가장 높은 가용 한 편지를 원한다고 결정했다. 나는 먼저 그것을 더 관용적으로 썼다. 그리고 나서 그것이 여전히 합리적인지를보기 위해 그것을 1 라이너로 크랭크했다. List comprehensions만큼 멋진데, unused = set (alphabet) -set (used) 대신 unused = [aphabet를 사용하지 않을 경우]를 사용해야합니다. 좋은 것!

    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]
    

    또한 string의 일부가 사용되지 않으므로 string을 사용하여 map / range / ord / chr을 사용하여 알파벳을 선택했습니다.

  12. ==============================

    12.Pypy와 같은 파이썬 플랫폼 전반의 플랫폼 문제를 포함하여 크로스 플랫폼 문제에 대해 걱정하지 않으려 고하고 런타임 중에 드라이브가 업데이트 될 때 사용하기를 원하는 제품을 원한다면 :

    Pypy와 같은 파이썬 플랫폼 전반의 플랫폼 문제를 포함하여 크로스 플랫폼 문제에 대해 걱정하지 않으려 고하고 런타임 중에 드라이브가 업데이트 될 때 사용하기를 원하는 제품을 원한다면 :

    >>> from os.path import exists
    >>> from sys import platform
    >>> drives = ''.join( l for l in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' if exists('%s:/'%l) ) if platform=='win32' else ''
    >>> drives
    'CZ'
    

    이 코드의 성능 테스트는 다음과 같습니다.

    4000 iterations; threshold of min + 250ns:
    __________________________________________________________________________________________________________code___|_______min______|_______max______|_______avg______|_efficiency
    ⡇⠀⠀⢀⠀⠀⠀⠀⠀⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
    ⣷⣷⣶⣼⣶⣴⣴⣤⣤⣧⣤⣤⣠⣠⣤⣤⣶⣤⣤⣄⣠⣦⣤⣠⣤⣤⣤⣤⣄⣠⣤⣠⣤⣤⣠⣤⣤⣤⣤⣤⣤⣄⣤⣤⣄⣤⣄⣤⣠⣀⣀⣤⣄⣤⢀⣀⢀⣠⣠⣀⣀⣤⣀⣠
        drives = ''.join( l for l in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' if exists('%s:/'%l) ) if platform=='win32' else '' |      290.049ns |     1975.975ns |      349.911ns |  82.892%
    
  13. from https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python by cc-by-sa and MIT license