2013-09-01 9 views
12

मेरे पास दो टैब-सीमांकित फ़ाइलें हैं, और मुझे दूसरी फ़ाइल में सभी पंक्तियों के विरुद्ध पहली फ़ाइल में प्रत्येक पंक्ति का परीक्षण करने की आवश्यकता है।केवल एक नेस्टेड लूप को तोड़ने के लिए कैसे करें

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

करें 2:

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

चलो कहते हैं कि मैं (file1) जिसके लिए कर्नल [3] file1 की तुलना में छोटी है में उत्पादन सभी पंक्तियों करना चाहते हैं उदाहरण के लिए,

file1 के लिए फ़ाइल 2 के किसी भी (नहीं) कॉल [2], यह देखते हुए कि कोल [1] वही हैं।

अपेक्षित उत्पादन:

row1 c1 36 345 A 
row2 c3 36 9949 B 

जब से मैं Ubuntu में काम कर रहा हूँ, मैं इनपुट आदेश इस तरह दिखना चाहते हैं:

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 
:
python code.py [file1] [file2] > [output]

मैं निम्नलिखित कोड लिखा था

हालांकि, आउटपुट इस तरह दिखता है:

row2 c3 36 9949 B 

यह बड़े डेटासेट के लिए स्पष्ट है, लेकिन मूल रूप से मुझे हमेशा केवल अंतिम पंक्ति मिलती है जिसके लिए नेस्टेड पाश में स्थिति सत्य थी। मुझे संदेह है कि "ब्रेक" मुझे दोनों लूपों से बाहर तोड़ रहा है। मैं जानना चाहता हूं (1) लूप के लिए केवल एक में से कैसे बाहर निकलना है, और (2) अगर यह एकमात्र समस्या है जो मुझे यहां मिली है।

+1

'ब्रेक' केवल आपको सबसे कम लूप से बाहर तोड़ देता है। –

+0

संबंधित: [दो फाइलों की तुलना करें और एक नई फाइल को लिखें लेकिन केवल कुछ लाइनों को आउटपुट करें?] (Http://stackoverflow.com/questions/18514979/compare-two-files-and-write-to-a-new- फ़ाइल बल्कि केवल-उत्पादन-ए-कुछ लाइनों) –

उत्तर

19

break और continue सबसे निचले पाश पर लागू होते हैं।

मुद्दा यह है कि आप केवल एक बार दूसरी फ़ाइल खोलते हैं, और इसलिए यह केवल एक बार पढ़ा जाता है। जब आप दूसरी बार for y in file2.readlines(): निष्पादित करते हैं, तो file2.readlines() एक खाली पुनरावर्तनीय लौटाता है।

या तो file2 = open(filename2, 'r') बाहरी लूप में ले जाएं, या का उपयोग file2 की शुरुआत में रिवाइंड करने के लिए करें।

2

आपको संख्यात्मक तारों को उनके संबंधित पूर्णांक मानों में पार्स करने की आवश्यकता है।

आप निम्नानुसार int('hoge') का उपयोग कर सकते हैं।

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 
संबंधित मुद्दे