J'ai deux fichiers séparés par des tabulations et je dois tester chaque ligne du premier fichier par rapport à toutes les lignes de l'autre fichier. Par exemple,
fichier1:
row1 c1 36 345 A
row2 c3 36 9949 B
row3 c4 36 858 C
fichier2:
row1 c1 3455 3800
row2 c3 6784 7843
row3 c3 10564 99302
row4 c5 1405 1563
disons que je voudrais sortir toutes les lignes de (fichier1) pour lesquelles col [3] de fichier1 est plus petit que tout (pas tous) col [2] de fichier2, étant donné que col [1] sont les mêmes.
Production attendue:
row1 c1 36 345 A
row2 c3 36 9949 B
Puisque je travaille dans Ubuntu, je voudrais que la commande d'entrée ressemble à ceci:python code.py [file1] [file2] > [output]
J'ai écrit le code suivant:
import sys
filename1 = sys.argv[1]
filename2 = sys.argv[2]
file1 = open(filename1, 'r')
file2 = open(filename2, 'r')
done = False
for x in file1.readlines():
col = x.strip().split()
for y in file2.readlines():
col2 = y.strip().split()
if col[1] == col2[1] and col[3] < col2[2]:
done = True
break
else: continue
print x
Cependant, la sortie ressemble à ceci:
row2 c3 36 9949 B
Cela est évident pour les ensembles de données plus volumineux, mais en gros, je n'ai toujours que la dernière ligne pour laquelle la condition dans la boucle imbriquée était vraie. Je soupçonne que "pause" me fait sortir des deux boucles. Je voudrais savoir (1) comment rompre une seule des boucles for et (2) si c'est le seul problème que j'ai ici.
break
et continue
s'appliquent à la boucle la plus intérieure.
Le problème est que vous n'ouvrez le deuxième fichier qu'une seule fois et qu'il n'est donc lu qu'une seule fois. Lorsque vous exécutez for y in file2.readlines():
pour la deuxième fois, file2.readlines()
renvoie un itérable vide.
Déplacez file2 = open(filename2, 'r')
dans la boucle externe, ou utilisez seek()
pour revenir en arrière au début de file2
.
Vous devez analyser les chaînes numériques à leurs valeurs entières correspondantes.
Vous pouvez utiliser int('hoge')
comme suit.
import sys
filename1 = sys.argv[1]
filename2 = sys.argv[2]
with open(filename1) as file1:
for x in file1:
with open(filename2) as file2:
col = x.strip().split()
for y in file2:
col2 = y.strip().split()
if col[1] == col2[1] and int(col[3]) < int(col2[2]):
print x