2017-05-11 9 views
0

特定のフォルダが存在する場合、解析して検索する機能があります。ブール型辞書のチェック

ゴール:これらのフォルダが辞書内に存在する場合は、緑色(フォルダあり)または赤色(フォルダは存在しません)で印刷します。私は辞書でブールチェックをすることに問題があります。私はかなり新しいPythonです。

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の2つの関数があり、もう1つはprint_colored_mnemonicsで、mneonics(存在する場合は緑色)は赤色(存在しない場合)を表示します。ここで

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コードされています:私はこの権利を

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) 

のでしょうか?ここで

get_statusコードですか私は本質的に、コンテンツが存在する場合、辞書(ニーモニック)のキーが緑色であることを望んでいます。キーに内容がない場合、ニーモニックは赤で印刷する必要があります。

+0

あなたは実際に何を持っていますか? –

+0

@AustinHastingsコードが正しく動作していません。実際にはコンテンツを保持していないフォルダがある場合、コードはすべてのニーモニックを緑色で印刷しています。 – FFF

+0

コードの最初のブロックは 'get_filtered_mnemonics'関数であるはずですか? –

答えて

2

自分のワークスペースにmedicalというディレクトリを作成しました。私は、あなたのコードを取り、このスクリプトを作っ

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) 

出力はこれです:remembermnemonicだろう

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

、私は、このようなサブディレクトリを作成しましたそれが何であっても、他のものはあなたのコードが期待しているものと一致するように見えます。

何かをする前に、私は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

関連する問題