2017-05-11 5 views
0

특정 폴더를 파싱하고 찾는 기능이 있습니다.부울 체크 사전

목표 : 사전에 이러한 폴더가있는 경우 녹색 (폴더 있음) 또는 빨간색 (폴더 없음)으로 인쇄하고 싶습니다. 사전에 부울 검사를하는 데 문제가 있습니다. 나는 파이썬에 상당히 익숙하다.

def parse_directory(startpath): 
for dir_path, folders, filenames in os.walk(startpath): 
    path_level = dir_path.replace(startpath, '').count(os.sep) 
    relative_dir = dir_path.replace(startpath, '').strip(os.sep) 
    current_dir = dir_path.split(os.sep)[-1] 


    if path_level == 1: 
     mnemonic = relative_dir 
     client_dictionary[mnemonic] = {} 


     if "4x Clinic" in folders: 
      client_dictionary[mnemonic]["clinic"] = True 
     else: 
      client_dictionary[mnemonic]["clinic"] = False 

     if "4x Hospital" in folders: 
      client_dictionary[mnemonic]["hospital"] = True 
     else: 
      client_dictionary[mnemonic]["hospital"] = False 

     if "4x Lab" in folders: 
      client_dictionary[mnemonic]["lab"] = True 
     else: 
      client_dictionary[mnemonic]["lab"] = False 

     if "Hub Millennium" in folders: 
      client_dictionary[mnemonic]["hub_millennium"] = True 
     else: 
      client_dictionary[mnemonic]["hub_millennium"] = False 

     if "Client Millennium" in folders: 
      client_dictionary[mnemonic]["client_millennium"] = True 
     else: 
      client_dictionary[mnemonic]["client_millennium"] = False 

위의 코드는 구문 분석합니다. 이제 불리언 체크를하기 위해서 1에서 get_status까지 그리고 다른 하나는 print_colored_mnemonics에서 mneonics (녹색이 있다면 녹색)를 빨간색 (존재하지 않음)으로 인쇄합니다.

def print_colored_mnemonics(startpath): 

RED = "\033[91m" 
RED2 = "\033[0m" 
GREEN = "\033[92m" 
GREEN2 = "\033[0m" 

if get_status(startpath) == True: 
    print(GREEN + '{}'.format(dict_keys) + GREEN2) 
    if get_status(startpath) == False: 
     print(RED + '{}'.format(dict_keys) + RED2) 

나는이 권리를하고 있는가 :

여기
def get_status(startpath): 
for dict_keys, dict_values in parsing_dict.items(): 
    if all(dict_values): 
     return True 
    elif any(dict_values): 
     return False 

print_colored_mnemonics 코드 : 여기

get_status 코드? 나는 본질적으로 어떤 내용이 존재한다면 사전 (니모닉)의 키가 녹색이되기를 원한다. 그리고 키에 내용이 없다면 니모닉이 빨간색으로 인쇄되어야합니다.

+0

실제로 어떤 문제가 있습니까? –

+0

@AustinHastings 코드가 제대로 작동하지 않습니다.실제로 코드를 보관하지 않는 폴더가있을 때 코드는 녹색으로 모든 니모닉을 인쇄합니다. – FFF

+0

첫 번째 코드 블록은'get_filtered_mnemonics' 함수로되어 있습니까? –

답변

2

내 작업 영역에 medical이라는 디렉토리를 만들었습니다. ,

$ python test.py medical 
startpath: medical 
{'remember': {'hub_millennium': False, 'lab': False, 'client_millennium': False, 'hospital': False, 'clinic': True}} 

remembermnemonic 될 경우 :

medical/ 
    remember/ 
     4x Clinic 
     Hub Millenium 

내가 다음 코드를 가져다가이 스크립트를 만든 : 나는 다음과 같은 서브 디렉토리를 생성

#!python3 
import sys 
import os 

client_dictionary = {} 

def parse_directory(startpath): 
    print("startpath:", startpath) 
    for dir_path, folders, filenames in os.walk(startpath): 
     path_level = dir_path.replace(startpath, '').count(os.sep) 
     relative_dir = dir_path.replace(startpath, '').strip(os.sep) 
     current_dir = dir_path.split(os.sep)[-1] 

     if path_level == 1: 
      mnemonic = relative_dir 
      client_dictionary[mnemonic] = {} 

      if "4x Clinic" in folders: 
       client_dictionary[mnemonic]["clinic"] = True 
      else: 
       client_dictionary[mnemonic]["clinic"] = False 

      if "4x Hospital" in folders: 
       client_dictionary[mnemonic]["hospital"] = True 
      else: 
       client_dictionary[mnemonic]["hospital"] = False 

      if "4x Lab" in folders: 
       client_dictionary[mnemonic]["lab"] = True 
      else: 
       client_dictionary[mnemonic]["lab"] = False 

      if "Hub Millennium" in folders: 
       client_dictionary[mnemonic]["hub_millennium"] = True 
      else: 
       client_dictionary[mnemonic]["hub_millennium"] = False 

      if "Client Millennium" in folders: 
       client_dictionary[mnemonic]["client_millennium"] = True 
      else: 
       client_dictionary[mnemonic]["client_millennium"] = False 


root_dir = '.' if len(sys.argv) < 2 else sys.argv[1] 
parse_directory(root_dir) 
print(client_dictionary) 

출력이입니다 그게 뭐든간에, 다른 것들은 코드가 기대하는 것과 일치하는 것처럼 보입니다.

다른 작업을 수행하기 전에 parse_directory 기능을 강화하겠습니다. @kindall이 지적했듯이, 사용할 수있는 더 짧은 형식이 있습니다. 나는 또한 mv Hub\ Millenium Hub\ Millennium에 가고있다 - 나의 철자법 과실!

#!python3 
import sys 
import os 

# If a mnemonic folder contains KEY, then it has features VALUE 
FEATURES = { 
    '4x Clinic' : 'clinic', 
    '5x Clinic' : 'clinic', # Supports multiple values! 
    '4x Hospital' : 'hospital', 
    '4x Lab' : 'lab', 
    'Hub Millennium' : 'hub_millennium', 
    'Client Millennium': 'client_millennium', 
} 

def parse_directory(startpath): 
    print("startpath:", startpath) 

    client_dictionary = {} 

    for dir_path, folders, filenames in os.walk(startpath): 
     path_level = dir_path.replace(startpath, '').count(os.sep) 
     relative_dir = dir_path.replace(startpath, '').strip(os.sep) 
     current_dir = dir_path.split(os.sep)[-1] 

     if path_level == 1: 
      mnemonic = relative_dir 

      # Set all features to False 
      cdm = {v:False for k,v in FEATURES.items()} 

      for folder,feature in FEATURES.items(): 
       if folder in folders: 
        cdm[feature] = True 

      client_dictionary[mnemonic] = cdm 

    return client_dictionary 

root_dir = '.' if len(sys.argv) < 2 else sys.argv[1] 
client = parse_directory(root_dir) 
print(client) 

이 같은 출력을 생성합니다

$ python test.py medical 
startpath: medical 
{'remember': {'clinic': True, 'client_millennium': False, 'lab': False, 'hub_millennium': True, 'hospital': False}} 

다음으로, 나는 새로운 하위 디렉토리, medical/allfeatures을 추가하고, 다양한 모든 서브 디렉토리 생성 : 4 배 연구소, 4 배 클리닉 등

을 그런 다음이 코드를 추가했습니다.

def get_status(mnemonic): 
    """Return True if all values of mnemonic dict are true, else False""" 
    return False not in mnemonic.values() 

root_dir = '.' if len(sys.argv) < 2 else sys.argv[1] 
client = parse_directory(root_dir) 
print("Client Info:", client) 
for mnemonic in client: 
    print("Status of {}: {}".format(mnemonic, get_status(client[mnemonic]))) 

결과는 다음과 같습니다.

$ python test.py medical 
startpath: medical 
Client Info: {'allfeatures': {'clinic': True, 'hub_millennium': True, 'hospital': True, 'lab': True, 'client_millennium': True}, 'remember': {'clinic': True, 'hub_millennium': True, 'hospital': False, 'lab': False, 'client_millennium': False}} 
Status of allfeatures: True 
Status of remember: False 

나는 이것이 당신이하려는 일이라고 생각합니다. 그렇다면 다음과 같은 방법으로 색상을 인쇄 할 수 있습니다.

if get_status(client[mnemonic]): 
    color_start = GREEN 
    color_end = GREEN2 
else: 
    color_start = RED 
    color_end = RED2 

print(color_start, mnemonic, color_end) 
+0

와우, 고마워. 나는 그것이 효과가 있는지 볼 것입니다. – FFF