[PYTHON] 파이썬에서 사용 가능한 모든 드라이브 문자를 나열하는 방법이 있습니까?
PYTHON파이썬에서 사용 가능한 모든 드라이브 문자를 나열하는 방법이 있습니까?
주석에서 말하는 것과 같거나 적습니다 : Windows 시스템에서 현재 사용중인 드라이브 문자를 모두 나열하는 Python의 (쉬운) 방법이 있습니까?
(내 google-fu는이 문제를 저를 실망 시켰습니다.)
관련 항목 :
해결법
-
==============================
1.
import win32api drives = win32api.GetLogicalDriveStrings() drives = drives.split('\000')[:-1] print drives
적응 : http://www.faqts.com/knowledge_base/view.phtml/aid/4670
-
==============================
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.Microsoft 스크립트 저장소에는 도움이 될 수있는이 방법이 포함되어 있습니다. 당신이 "이름", "시스템 이름", "볼륨 이름", 또는 어쩌면 다른 것을 원한다면 나는 확신 할 수 없기 때문에, 윈도우 머신을 테스트 할 필요가 없다.
Microsoft 스크립트 저장소에는 도움이 될 수있는이 방법이 포함되어 있습니다. 당신이 "이름", "시스템 이름", "볼륨 이름", 또는 어쩌면 다른 것을 원한다면 나는 확신 할 수 없기 때문에, 윈도우 머신을 테스트 할 필요가 없다.
-
==============================
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.Google에서이 솔루션을 찾았습니다. 원본에서 약간 수정되었습니다. 꽤 파이썬스럽고 "이국적인"수입품이 필요하지 않습니다.
Google에서이 솔루션을 찾았습니다. 원본에서 약간 수정되었습니다. 꽤 파이썬스럽고 "이국적인"수입품이 필요하지 않습니다.
import os, string available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]
-
==============================
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.나는이 코드를 썼다 :
나는이 코드를 썼다 :
import os drives = [ chr(x) + ":" for x in range(65,90) if os.path.exists(chr(x) + ":") ]
@ Barmaley의 대답을 기반으로하지만 문자열을 사용하지 않는 이점이 있습니다. 모듈을 사용할 수 있습니다. 또한 @ SingleNegationElimination의 대답과 달리 내 시스템에서도 작동합니다.
-
==============================
8.Windows에서는 os.popen을 할 수 있습니다.
Windows에서는 os.popen을 할 수 있습니다.
import os print os.popen("fsutil fsinfo drives").readlines()
-
==============================
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.노트북 분야에 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.유사한 작업의 일환으로 나는 또한 무료 드라이브 문자를 얻어야했습니다. 나는 가장 높은 가용 한 편지를 원한다고 결정했다. 나는 먼저 그것을 더 관용적으로 썼다. 그리고 나서 그것이 여전히 합리적인지를보기 위해 그것을 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.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%
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
'PYTHON' 카테고리의 다른 글
[PYTHON] PyPI에 패키지 업로드 실패 : 410 사라짐 (0) | 2018.10.13 |
---|---|
[PYTHON] matplotlib에서 (임의의) * .otf 또는 * .ttf 글꼴을 사용하는 방법? (0) | 2018.10.13 |
[PYTHON] 멀티 프로세싱과 딜은 무엇을 함께 할 수 있습니까? (0) | 2018.10.13 |
[PYTHON] 파이썬에서 클래스의 모든 멤버 변수에 대해 루핑하기 (0) | 2018.10.12 |
[PYTHON] 빈 목록 인 기본 매개 변수를 피하는 비법은 무엇입니까? (0) | 2018.10.12 |