Newline सीमांकित फ़ाइलों को पढ़ने और newlines को त्यागने के लिए सबसे अच्छी विधि?


84

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

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

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

सुझाव?


विभाजन ("/ n") का उपयोग करने के बारे में क्या?
जील

1
के रूप में ही: stackoverflow.com/questions/339537/…
विजय देव

मुझे लगता है कि फ़ाइल को बंद करने के लिए बेहतर होगा
Paweł Pra'ak

जवाबों:


196
lines = open(filename).read().splitlines()

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

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

6
CPython के साथ, फ़ाइल ऑब्जेक्ट के लिए संदर्भ गणना शून्य हो जाएगी क्योंकि यह अब उपयोग में नहीं है और फ़ाइल स्वचालित रूप से बंद हो जाएगी। Jython और IronPython की तरह विशुद्ध रूप से GC'd कार्यान्वयन के लिए, फ़ाइल GC बंद होने तक बंद नहीं हो सकती है - इसलिए यह भिन्नता भिन्न नहीं हो सकती है।
कर्ट हेगनलोचर

2
8 जीबी रैम के साथ मैक ओएस एक्स 10.7.5 पर, मैं 2047 एमबी (मेरी परिभाषा: 1 एमबी = 1024 x 1024 बाइट) तक की फाइल पढ़ सकता है। 2048MB मेमोरी मेमोरी अपवाद को फेंक देगा।
हाई वु

1
@WKPlus उत्कृष्ट प्रश्न - उत्तर है "यह निर्भर करता है" stackoverflow.com/a/15099341/994153 (CPython इसे बंद कर देगा क्योंकि संदर्भ गणना शून्य तक गिर जाती है, लेकिन अन्य पायथन कार्यान्वयन इसे बंद नहीं कर सकते, इसलिए इसे स्पष्ट करने के लिए सबसे अच्छा है। )
कॉलिन डी बेनेट

23

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

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

हालांकि, आप सबसे अधिक संभावना है कि आप इसका उपयोग ट्रेलिंग व्हाट्सएप से छुटकारा पाने के लिए भी करना चाहते हैं।

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

यह RHS के आसपास [] नहीं होना चाहिए, नहीं ()?
andrewb

8
@andrewb यूज़िंग () एक जेनरेटर एक्सप्रेशन देता है, जो [] (एक लिस्ट कॉम्प्रिहेंशन) का उपयोग करने में उतनी मेमोरी का उपयोग नहीं करता है।
जोनाथन हार्टले

9

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

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

जेनरेटर एक्सप्रेशन पूरी फाइल को मेमोरी में लोड होने से बचाता है और फाइल को withबंद करना सुनिश्चित करता है


यह अनिवार्य रूप से @ TimoLinna के उत्तर के रूप में एक ही साल पहले पोस्ट किया है ...
Martineau


4

बस जनरेटर अभिव्यक्ति का उपयोग करें:

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

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


3

मैं इसका उपयोग करता हूं

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

फिर मैं इस तरह की चीजें कर सकता हूं।

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

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


2

मैं इसे इस तरह से करूँगा:

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

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

यकीन नहीं है कि अगर यह खाली लाइनों को फ़िल्टर करने का इरादा था, लेकिन यह ... if l.strip() is not ''मेरे मामले में जो है, उससे अधिक संक्षिप्त है ।
Zach यंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.