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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ??