2013-09-01 14 views
12

Mam dwa pliki rozdzielane tabulatorami i muszę przetestować każdy wiersz w pierwszym pliku względem wszystkich wierszy w drugim pliku. Na przykład,jak wyrwać tylko jedną zagnieżdżoną pętlę

plik1:

row1 c1 36 345 A 
row2 c3 36 9949 B 
row3 c4 36 858 C 

File2:

row1 c1 3455 3800 
row2 c3 6784 7843 
row3 c3 10564 99302 
row4 c5 1405 1563 

powiedzmy chciałbym wyjściowe wszystkich wierszy (pliku1), dla którego col [3] pliku1 jest mniejsza dowolny (nie każdy) col [2] pliku 2, biorąc pod uwagę, że col [1] są takie same.

wyjście z oczekiwaniami:

row1 c1 36 345 A 
row2 c3 36 9949 B 

Odkąd pracuję w Ubuntu, chciałbym polecenia wejściowego wyglądać następująco:
python code.py [file1] [file2] > [output]

Napisałem następujący kod:

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 

Jednak wynik wygląda następująco:

row2 c3 36 9949 B 

Jest to oczywiste dla większych zestawów danych, ale zasadniczo zawsze otrzymuję tylko ostatni wiersz, dla którego warunek w zagnieżdżonej pętli był prawdziwy. Podejrzewam, że "przerwa" wyrywa mnie z obu pętli. Chciałbym wiedzieć (1), jak wyrwać się z jednej z pętli for i (2), jeśli jest to jedyny problem, jaki mam tutaj.

+1

'break' tylko dzieli cię z najbardziej wewnętrzną pętlą. –

+0

Powiązane: [Porównaj dwa pliki i napisz do nowego pliku, ale wypisz tylko kilka linii?] (Http://stackoverflow.com/questions/18514979/compare-two-files-and-write-to-a-new- file-but-only-output-a-few-lines) –

Odpowiedz

19

break i continue dotyczą najbardziej wewnętrznej pętli.

Problem polega na tym, że drugi plik otwiera się tylko raz, dlatego jest czytany tylko raz. Gdy wykonasz for y in file2.readlines(): po raz drugi, file2.readlines() zwraca pustą wartość iterowalną.

Przenieś file2 = open(filename2, 'r') do zewnętrznej pętli lub użyj seek(), aby przewinąć do początku .

2

Należy przeanalizować łańcuchy liczbowe do odpowiadających im wartości całkowitych.

Możesz użyć int('hoge') w następujący sposób.

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 
Powiązane problemy