2017-10-19 23 views
0

J'ai créé un script pour traiter chaque élément dans un fichier Excel à 3 colonnes exporté en tant que fichier .txt en 3 listes (1 liste pour chaque colonne). Il y a 22 lignes dans le fichier .txt, y compris l'en-tête. Avec ces 3 listes, j'essaye de créer un dictionnaire imbriqué où chaque colonne est une clé, une clé dans une valeur, ou une valeur dans une valeur (par exemple: {Tag1: {Tag2: Tag3} ...} pour cependant Lorsque je liste ces listes dans un dictionnaire imbriqué, il tronque la liste et ne zippe que 19 éléments dans le dictionnaire, et non 22. Quelqu'un pourrait-il dépanner mon code et voir ce que fait le dictionnaire? à ma listeLorsque je crée un dictionnaire imbriqué à partir d'une liste, pourquoi la longueur de mon dictionnaire est-elle plus courte que celle de chaque liste?

Voici le fichier txt pour référence: enter image description here

Voici mon script:

import glob 
source_file = glob.glob('file_path/test.txt')[0] 
time = [] 
code = [] 
identifier = [] 
data_set = {} 


for line in open (source_file,'r'): 
    line_split = line.split('\t') 
    tag_3 = line_split[-1].replace('\n','') 
    tag_2 = line_split[1] 
    tag_1 = line_split[0] 

    time.append(tag_3) 
    code.append(tag_2) 
    identifier.append(tag_1) 

data_set = {a:{b:c} for a,b,c in zip(identifier, code, time)} 

EDIT: voici un lien vers une version téléchargeable du fichier: https://drive.google.com/file/d/0B2s43FKt5BZgQldULXVOR0RBeTg/view?usp=sharing

EDIT 2: Cela devrait être la sortie désirée:

data_set = { 
'Tag1':{'Tag2':'Tag3'}, 
'0.1M':{'20':'10'}, 
'0.1MCD':{'2':'1'}, 
'0.25M':{'17':'1'}, 
'0.25MC':{'18':'1'}, 
'0.5MCN':{'16':'1'}, 
'0.MCD8':{'15':'1'}, 
'10':{'36':'5'}, 
'1029':{'75':'17'}, 
'1029A':{'22':'15'}, 
'1029B':{'49':'18'}, 
'1029BCD':{'23':'15'}, 
'1029BCDA':{'27':'18'}, 
'109B8N':{'63':'10'}, 
'1193D4M':{'51':'16'}, 
'1193D4N':{'2':'11'}, 
'1193D8M':{'17':'16'}, 
'11938N':{'25':'12'}, 
'1193CD4M':{'53':'16'}, 
'1193CD4N':{'83':'13'}, 
'118M':{'20':'16'}, 
'1193BCN':{'16':'7'}, 

}

EDIT 3: Il se la dictionnaire tronque la valeur s'il existe des valeurs en double dans les listes. Y-a-t-il un moyen d'éviter ça?

+0

pouvez-vous poster le fichier dans le texte afin que les gens peuvent déboguer? – VBB

+0

Pourquoi ne pas créer dict lors de la lecture de fichier? Aussi ne redéfinissez pas le nom 'dict' intégré –

Répondre

0

Vous pouvez essayer ceci:

s = [b for b in [i.strip('\n').split() for i in open('file.txt')] if b] 
final_data = {a:{b:c} for a, b, c in s} 

Sortie:

{'1029BCDA': {'27': '18'}, '1029BCD': {'23': '15'}, '0.25M': {'17': '1'}, '118M': {'20': '16'}, '0.1M': {'20': '10'}, '11934D4N': {'83': '13'}, '0.5MCD8': {'15': '1'}, '1193D8M': {'17': '16'}, '1193CD4M': {'53': '16'}, '109B8N': {'63': '10'}, '10': {'36': '5'}, '1193D4M': {'51': '16'}, '1193D4N': {'2': '11'}, '0.1MCD': {'2': '1'}, '1193BCN': {'16': '7'}, '0.25MC': {'18': '1'}, '11938N': {'25': '12'}, '0.5MCN': {'16': '1'}, 'Tag1': {'Tag2': 'Tag3'}, '1029': {'75': '17'}, '1029A': {'22': '15'}, '1029B': {'49': '18'}} 

Edit: en utilisant un collections.defaultdict pour la manipulation correcte des valeurs en double:

from collections import defaultdict 
d = defaultdict(list) 
for a, b, c in s: 
    d[a].append({b:c}) 
+0

Je reçois un code d'erreur qui dit" trop de valeurs à décompresser "quand je branche votre code – superasiantomtom95

+0

@ superasiantomtom95 s'il vous plaît poster votre sortie souhaitée du fichier. – Ajax1234

+0

@ superasiantomtom95 En outre, j'ai fait plusieurs changements, laissez-moi savoir comment cela fonctionne maintenant. – Ajax1234

0

Dictionnaire ne peut pas avoir en double clés. Ce que vous pouvez faire est de définir un dictionnaire pour contenir une liste de valeurs. Dans votre cas, remplacez {Tag1: {Tag2: Tag3}} par {Tag1: [{Tag2: Tag3}]}