2017-08-10 5 views
0

J'ai plusieurs fichiers * .txt avec un ID et une valeur, et je souhaite créer un dictionnaire unique. Cependant, certains ID sont répétés dans certains fichiers, et pour ces ID, je veux CONCATENATED les valeurs. Ceci est un exemple de deux fichiers (mais j'ai un tas de fichiers, donc je pense que j'ai besoin de glob.glob) :(Notez que toutes les 'valeurs' d'un certain fichier ont la même longueur, donc je peux ajouter '-' . plusieurs fois le len (valeur) est manquanteCréation d'un mappage dict à partir de plusieurs fichiers texte

fichier 1

ID01 
Hi 
ID02 
my 
ID03 
ni 

File 2

ID02 
name 
ID04 
meet 
ID05 
your 

sortie Desire: (Notez que lorsqu'il n'y a pas ID répétitif, je veux ajouter ' Na 'ou' - ', avec le même len (valeur) à concaténer) Ceci est ma sortie:

ID01 
Hi---- 
ID02 
myname 
ID03 
ni---- 
ID04 
--meet 
ID05 
--your 

Je veux juste stocker la sortie dans un dictionnaire. De plus, je suppose que si j'imprime le fichier quand il est ouvert, je pourrais savoir dans quel ordre les fichiers sont ouverts après l'autre, n'est-ce pas?

C'est ce que j'ai: (Je ne peux pas concaténer mes valeurs jusqu'à présent)

output={} 
list = [] 
for file in glob.glob('*.txt'):   
    FI = open(file,'r') 
    for line in FI.readlines(): 
     if (line[0]=='I'):  #I am interested in storing only the ones that start with I, for a future analysis. I know this can be done separating key and value with '\t'. Also, I am sure the next lines (values) does not start with 'I' 
      ID = line.rstrip() 
      output[ID] = '' 
      if ID not in list: 
       list.append(ID)  
     else: 
      output[ID] = output[ID] + line.rstrip() 

    if seqs_name in list: 
     seqs[seqs_name] += seqs[seqs_name] 

    print (file) 
    FI.close() 


print ('This is your final list: ') 
print (list) #so far, I am getting the right final list, with no repetitive ID 
print (output) #PROBLEM: the repetitive ID, is being concatenated twice the 'value' in the last file read. 

En outre, comment ajouter le « - » lorsque l'ID ne se répète pas? J'apprécierais grandement votre aide. En résumé: Je ne parviens pas à concaténer des valeurs lorsque la clé est répétée dans un autre fichier. Et si les clés ne sont pas répétées, je veux ajouter '-', afin que je puisse plus tard imprimer le nom du fichier et savoir dans quel fichier certains ID n'ont pas de valeur.

Répondre

0

Quelques problèmes avec votre code existant:

  1. line[0] == 'ID': line[0] retourne un caractère, cette comparaison est toujours fausse. Utilisez plutôt str.startswidth(xxx) pour vérifier si une chaîne commence par xxx.

  2. Vous ne récupérez pas le texte après le ID correctement. La façon la plus simple de le faire est d'appeler le next(f).

  3. Vous n'avez pas besoin d'une deuxième liste. En outre, ne nommez pas votre variable list car elle ombrage l'intégré.


import collections 

output = collections.defaultdict(str) 
for file in glob.glob('*.txt'):   
    with open(file, 'r') as f: 
    for line in f: 
     if line.startswith('ID'): 
      try: 
       text = next(f) 
       output[line.strip()] += text.strip() + ' ' 
      except StopIteration: 
       pass 

print(output) 

Ça fait mal de ne jamais attraper quelques exceptions près, en utilisant try-except.

+0

ok, votre nouvelle version fonctionne :). Merci beaucoup! – gusa10

+0

Et si vous voulez ajouter '-' ou 'Na' lorsqu'une valeur n'est pas concaténée? – gusa10

+0

@ gusa10 une question par fil s'il vous plaît;) Vous pouvez envisager de marquer cela accepté si cela a aidé. En ce qui concerne l'ajout de Na, vous devrez obtenir du texte, puis vérifier si le texte commence aussi par l'ID. Cela signifie que le texte actuel est manquant. –