J'essaie d'utiliser Python pour manipuler un fichier texte à partir du format A:

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

En format B:

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

Plus précisément, voici un bref aperçu du fichier lui-même (une seule clé affichée, des milliers d'autres dans le fichier complet):

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

Et la sortie souhaité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 clés, mais j'ai du mal à écrire le code pour stocker les valeurs associées à chaque clé, puis à imprimer ces paires clé-valeur. Quelqu'un peut-il m'aider dans 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)
1
alexhli 23 nov. 2011 à 22:48

3 réponses

Meilleure réponse

Faites-le 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 que la première ligne contient une clé et échouera sinon.

5
Sven Marnach 23 nov. 2011 à 18:55

Premièrement, 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")

La prochaine étape serait d'utiliser une machine d'état très simple. Ainsi:

current_key = ""

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

    else:
        print " ".join([current_key, line.strip()])
0
wal-o-mat 23 nov. 2011 à 18:55

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)))
0
Mark Tolonen 23 nov. 2011 à 19:52
8247499