2009-02-13 6 views
74

मैं पाइथन में न्यूलाइन सीमांकित फ़ाइलों में पढ़ने के दौरान न्यूलाइन से छुटकारा पाने के लिए सबसे अच्छा तरीका निर्धारित करने का प्रयास कर रहा हूं।पायथन में नई लाइन सीमांकित फ़ाइलों को पढ़ने और नई लाइनों को हटाने के लिए सबसे अच्छी विधि?

जो मैंने साथ आया है वह निम्नलिखित कोड है, परीक्षण के लिए फेंकने कोड शामिल करें।

import os 

def getfile(filename,results): 
    f = open(filename) 
    filecontents = f.readlines() 
    for line in filecontents: 
    foo = line.strip('\n') 
    results.append(foo) 
    return results 

blahblah = [] 

getfile('/tmp/foo',blahblah) 

for x in blahblah: 
    print x 

सुझाव?

+0

बंद करने सुनिश्चित करता है? – jle

+1

जैसा ही है: http://stackoverflow.com/questions/339537/end-line-characters-from-lines-read-from-text-file-using-python –

+0

मुझे लगता है कि फ़ाइल को बंद करना बेहतर होगा –

उत्तर

179
lines = open(filename).read().splitlines() 
+0

यह उत्तर मैं करता हूं कि मैं क्या कर रहा था, मुझे यकीन है कि मुझे कुछ त्रुटि जांच और इस तरह की आवश्यकता होगी, लेकिन इस विशिष्ट आवश्यकता के लिए, यह बहुत अच्छा है। जवाब देने के लिए सभी को धन्यवाद! – solarce

+0

मुझे यह पसंद है लेकिन अगर आप फ़ाइल हैंडल को सेव नहीं करते हैं तो आप फ़ाइल को कैसे बंद करते हैं? या यह स्वचालित रूप से बंद है? –

+6

सीपीथॉन के साथ, फाइल ऑब्जेक्ट के लिए संदर्भ गणना शून्य पर जायेगी जब यह अब उपयोग में नहीं आती है और फ़ाइल स्वचालित रूप से बंद हो जाएगी। ज्योथन और आयरनपीथन जैसे पूरी तरह से जीसीएड कार्यान्वयन के लिए, फ़ाइल जीसी रन तक बंद नहीं हो सकती है - इसलिए यह terse भिन्नता इष्टतम नहीं हो सकता है। –

8
for line in file('/tmp/foo'): 
    print line.strip('\n') 
+0

यह पूरी तरह से काम करता है। बड़ी फ़ाइलों के लिए भी काम करता है। –

2

मैं इस तरह यह करना चाहते हैं:

f = open('test.txt') 
l = [l for l in f.readlines() if l.strip()] 
f.close() 
print l 
+0

जबकि कर्ट हेगनलोचेर का जवाब तकनीकी रूप से बेहतर है, यह जवाब एक अच्छा प्रारंभिक बिंदु है यदि आपको प्रत्येक पंक्ति में अन्य प्रसंस्करण जोड़ने की आवश्यकता है। – TomOnTime

+0

सुनिश्चित नहीं है कि यह रिक्त रेखाओं को फ़िल्टर करने का इरादा है, लेकिन यह 'से अधिक संक्षिप्त है ... यदि l.strip() नहीं है, 'जो मुझे मेरे मामले में चाहिए। –

20

यहाँ एक जनरेटर करता है कि आप क्या अनुरोध किया है। इस मामले में, rstrip का उपयोग स्ट्रिप से पर्याप्त और थोड़ा तेज है।

lines = (line.rstrip('\n') for line in open(filename)) 

हालांकि, आप शायद पीछे की ओर सफेद जगहों से छुटकारा पाने के लिए इसका उपयोग करना चाहेंगे।

lines = (line.rstrip() for line in open(filename)) 
+0

आरएचएस के आस-पास नहीं होना चाहिए, नहीं()? – andrewb

+7

@andrewb का उपयोग() एक जनरेटर अभिव्यक्ति देता है, जो [] (एक सूची समझ) का उपयोग करने के रूप में ज्यादा स्मृति का उपयोग नहीं करता है। –

3

मैं का उपयोग इस

def cleaned(aFile): 
    for line in aFile: 
     yield line.strip() 

तो मैं इस तरह कर सकते हैं।

lines = list(cleaned(open("file","r"))) 

या, मैं अतिरिक्त कार्यों के लिए, उदाहरण के लिए, रिक्त लाइनों ड्रॉप या छोड़ टिप्पणी लाइनों या जो कुछ भी से साफ विस्तार कर सकते हैं।

4

बस उपयोग जनरेटर भाव:

blahblah = (l.rstrip() for l in open(filename)) 
for x in blahblah: 
    print x 

इसके अलावा, मैं स्मृति में पूरे फ़ाइल को पढ़ने के खिलाफ सलाह देने के लिए चाहते हैं - जनरेटर से अधिक पाशन और अधिक बड़े डेटासेट पर कुशल है।

8

इस दृष्टिकोण के बारे में आप क्या सोचते हैं?

with open(filename) as data: 
    datalines = (line.rstrip('\r\n') for line in data) 
    for line in datalines: 
     ...do something awesome... 

जेनरेटर अभिव्यक्ति स्मृति में पूरे फ़ाइल लोड करने से बचा जाता है और with क्या विभाजन ("/ एन") का उपयोग के बारे में फ़ाइल

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