Fltrage données dans un fichier
Bonjour à tous,
Je dois filtrer un fichier (exemple avec quelques lignes sur environ 4000 ci dessous) en gardant que les lignes où les valeurs de A,B,C, et D de la colonne 8 sont inférieur à 0.05.
Code:
1 2 3 4 5 6 7 8
| chr1 953778 rs369883627 GA CC 34644.1 PASS A=0.09;B=0.07;C=0.06;D=0.100
chr1 972419 rs111909377 T C 1442.72 PASS A=0.01;B=0.02;C=0.04;D=0.03
chr1 3637103 rs114719689 G A 3975.78 PASS A=0.09;B=.;C=.;D=0.100
chr1 3637208 rs114719689 G T 4975.79 PASS A=0.02;B=.;C=.;D=0.01
chr1 972943 rs61732689 G A 2119.47 PASS A=0.08;B=0.10;C=0.07
chr1 1309258 rs12094447 G A 889.21 PASS A=0.01;B=0.02;D=0.03
chr1 1291471 rs61730205 C T 1003.14 PASS variant
chr1 1291675 rs61730506 C T 1008.14 PASS normal |
Pour ce faire j'ai utilisé ce code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
#Ouverture fichier input et output
output = open("/home/kevin/Bureau/out_data_test.txt","w")
f1 = open("/home/kevin/Bureau/data_test.txt","r")
l1 = f1.readlines()
#Ligne où A,B,C, et D sont présent et il n'y a pas de point à la place d'un float
for line in l1:
A = re.search("A*=[0-9.,e-]*",line)
B = re.search("B*=[0-9.,e-]*",line)
C = re.search("C*=[0-9.,e-]*",line)
D = re.search("D*=[0-9.,e-]*",line)
#Si on a tous les éléments et que tous ces éléments ont chacun une valeur
if A and D and B and C:
if not (re.search("B*=\.[^0-9]",line) or re.search("C*=\.[^0-9]",line) or re.search("D*=\.[^0-9]",line) or re.search("A*=\.[^0-9]",line)):
if float(A.group(0).split("=")[1]) < 0.05 and float(D.group(0).split("=")[1]) < 0.05 and float(B.group(0).split("=")[1]) < 0.05 and float(C.group(0).split("=")[1]) < 0.05:
output.write(line)
#Si on a des éléments non présents (None où un point comme valeur) et que le autres sont inférieur à 0.05
elif (A is not None and not re.search("A*=\.[^0-9]",line) and float(A.group(0).split("=")[1]) < 0.05 or D is not None and not re.search("D*=\.[^0-9]",line) and float(D.group(0).split("=")[1]) < 0.05 or B is not None and not re.search("B*=\.[^0-9]",line) and float(D.group(0).split("=")[1]) < 0.05 or C is not None and not re.search("C*=\.[^0-9]",line) and float(C.group(0).split("=")[1]) < 0.05):
output.write(line)
#Si aucun n'est présent et qu'on a le mot variant
if not(A or D or B or C) and "variant" in line:
output.write(line) |
Le problème est que dans ma sortie, il y a des lignes où il y A=0.08;B=0.10;C=0.07 et D=None. Dans ce cas, toutes les valeurs supérieurs sont à 0.05. De plus, je n'arrive pas à récupérer les lignes où il y a des points comme par exemple : A=0.02;B=.;C=.;D=0.01.
Que manque t'il à mon code pour éviter pouvoir atteindre mon objectif final s'il vous plaît ??