2011-11-23 2 views
1

Je suis en train d'utiliser Python pour manipuler un fichier texte de format A:utiliser Python pour manipuler txt présentation de fichiers de valeur clé de regroupement

Key1 
Key1value1 
Key1value2 
Key1value3 
Key2 
Key2value1 
Key2value2 
Key2value3 
Key3... 

au format B:

Key1 Key1value1 
Key1 Key1value2 
Key1 Key1value3 
Key2 Key2value1 
Key2 Key2value2 
Key2 Key2value3 
Key3 Key3value1... 

plus précisément, voici un bref regard sur le fichier lui-même (une seule clé montré, des milliers d'autres dans le fichier complet):

chr22:16287243: PASS 
patientID1 G/G 
patientID2 G/G 
patient ID3 G/G 

Et la sortie désirée ici:

chr22:16287243: PASS patientID1 G/G 
chr22:16287243: PASS patientID2 G/G 
chr22:16287243: PASS patientID3 G/G 

J'ai écrit le code suivant qui peut détecter/afficher les touches, mais je vais avoir du mal à écrire le code pour stocker les valeurs associées à chaque touche, et l'impression par la suite ces Key- paires de valeurs. Quelqu'un peut-il m'aider s'il vous plaît avec cette tâche?

import sys 
import re 

records=[] 

with open('filepath', 'r') as infile: 
    for line in infile: 
     variant = re.search("\Achr\d",line, re.I) # all variants start with "chr" 
     if variant: 
      records.append(line.replace("\n","")) 
      #parse lines until a new variant is encountered 

for r in records: 
    print (r) 

Répondre

5

Faites-en un seul passage, sans stocker les lignes:

with open("input") as infile, open("ouptut", "w") as outfile: 
    for line in infile: 
     if line.startswith("chr"): 
      key = line.strip() 
     else: 
      print >> outfile, key, line.rstrip("\n") 

Ce code suppose la première ligne contient une clé et échouera autrement.

+0

je devais changer la façon dont le stmt d'impression a été formaté un peu, mais maintenant il fonctionne très bien ! Je ne connaissais pas non plus le "startswith", donc merci pour ça aussi :) – alexhli

0

D'abord, si les chaînes commencent par une séquence de caractères, n'utilisez pas d'expressions régulières. Beaucoup plus simple et plus facile à lire:

if line.startswith("chr") 

L'étape suivante consisterait à utiliser une machine à états très simple. Comme si:

current_key = "" 

for line in file: 
    if line.startswith("chr"): 
     current_key = line.strip() 

    else: 
     print " ".join([current_key, line.strip()]) 
+0

Cette astuce de caractère est utile, merci – alexhli

0

S'il y a toujours le même nombre de valeurs par clé, iSlice est utile:

from itertools import islice 

with open('input.txt') as fin, open('output.txt','w') as fout: 
    for k in fin: 
     for v in islice(fin,3): 
      fout.write(' '.join((k.strip(),v))) 
Questions connexes