2010-07-23 10 views
12

मेरे पास दो फाइलें हैं, और मैं दोनों में से कुछ लाइन-वार ऑपरेशन करना चाहता हूं। (दूसरे शब्दों में, प्रत्येक फ़ाइल की पहली पंक्तियां दूसरी होती हैं, जैसे कि दूसरी, आदि) अब, मैं दोनों फ़ाइलों को एक साथ फिर से भरने के लिए कुछ छोटे बोझिल तरीकों के बारे में सोच सकता हूं; हालांकि, यह पायथन है, इसलिए मुझे लगता है कि कुछ वाक्य रचनात्मक शॉर्टेंड हैं।एक साथ दो फाइलों में लाइनों में फिर से भरने के लिए कैसे?

दूसरे शब्दों में, वहाँ इतना है कि यह एक साथ दोनों फ़ाइलों से डेटा खींचती

for line in file: 

अनुकूल करने के लिए कुछ सरल तरीका है?

उत्तर

26

दो पुनरावृत्तियों में शामिल होने के लिए itertools.izip का उपयोग करें।

from itertools import izip 
for line_from_file_1, line_from_file_2 in izip(open(file_1), open(file_2)): 

फ़ाइलों असमान लंबाई के हैं, तो izip_longest का उपयोग करें। भावी पीढ़ी के लिए

+0

+ ज़िप – zvone

+3

के बजाय izip का उपयोग करने के लिए पायथन 3 में, आपको 'ज़िप' का उपयोग करने की आवश्यकता है। – tttthomasssss

+0

पायथन 3 में, 'itertools.zip_longest' का उपयोग करें यदि आप सबसे लंबी फ़ाइल के अंत तक लाइनों का उपभोग करना चाहते हैं। –

7

आप हालांकि

for line1, line2 in zip(file1, file2): 
    #do stuff 

सावधान की कोशिश कर सकते हैं, जब छोटे फ़ाइल समाप्त हो जाती है इस पाश बाहर निकल जाएगा।

पाइथन 2, itertools.izip का उपयोग करते समय इस तरह की चीज़ के लिए बेहतर है क्योंकि यह list नहीं बनाता है।

+0

'ज़िप 'ठीक है अगर आप पाइथन 3 का उपयोग करते हैं (जो शायद आपने उत्तर दिया था)। संपादन। –

3

एक पूरा उदाहरण:

from itertools import izip, izip_longest 

file1name = '/some/path/and/file' 
file2name = '/another/path/and/another/file' 

with open(file1name) as file1, open(file2name) as file2: 
    for line1, line2 in izip(file1, file2): # or izip_longest 
     # do something with the lines 

with का उपयोग सुनिश्चित करता है फ़ाइलों के उपयोग के बाद साफ हो जाने, एक अपवाद तब होता है, भले ही।

संबंधित मुद्दे