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)
3 réponses
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.
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()])
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
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.