न्यूलाइन्स के बिना फाइल कैसे पढ़ें?


374

पायथन में, बुला

temp = open(filename,'r').readlines()

उस सूची में परिणाम जिसमें प्रत्येक तत्व फ़ाइल में एक पंक्ति है। यह थोड़ा बेवकूफ है, लेकिन फिर भी: readlines()प्रत्येक तत्व को न्यूलाइन चरित्र भी लिखता है, कुछ ऐसा जो मैं नहीं करना चाहता।

मैं इससे कैसे बच सकता हूं?


4
उपयोग पट्टी: [l.strip('\n\r') for l in temp]। या भी rstrip। और यात्रा यहाँ के बाद से यह हो सकता है in openके बजाय in temp
gorlum0

11
मुझे अच्छा लगेगा अगर पायथन 3 में उस समय की newlineदलील को नए सिरे से खोलने के लिए एक मूल्य निर्धारित किया जाए।
jxramos

जवाबों:


554

आप पूरी फ़ाइल और स्प्लिट लाइनों का उपयोग करके पढ़ सकते हैं str.splitlines:

temp = file.read().splitlines()

या आप हाथ से नई रेखा खींच सकते हैं:

temp = [line[:-1] for line in file]

नोट: यह अंतिम समाधान केवल तभी काम करता है जब फ़ाइल एक नई पंक्ति के साथ समाप्त होती है, अन्यथा अंतिम पंक्ति एक चरित्र खो देगी।

यह धारणा ज्यादातर मामलों में सच है (विशेष रूप से पाठ संपादकों द्वारा बनाई गई फ़ाइलों के लिए, जो अक्सर किसी भी तरह एक नई रूपरेखा जोड़ते हैं)।

यदि आप इससे बचना चाहते हैं तो आप फ़ाइल के अंत में एक नई पंक्ति जोड़ सकते हैं:

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # go at the end of the file
    if f.read(1) != '\n':
        # add missing newline if not already present
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

या stripइसके बजाय एक सरल विकल्प न्यूलाइन के लिए है:

[line.rstrip('\n') for line in file]

या यहां तक ​​कि, हालांकि बहुत अपठनीय:

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

जो इस तथ्य का फायदा उठाता है कि वापसी मूल्य orएक बूलियन नहीं है, लेकिन उस वस्तु का मूल्यांकन किया गया था जो सही या गलत था।


readlinesविधि वास्तव में के बराबर है:

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines

# or equivalently

def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

चूंकि readline()न्यूलाइन भी readlines()रखता है।

नोट: करने के लिए समरूपता के लिए विधि है नहीं नई पंक्तियां न खत्म होने वाली जोड़ते हैं, ताकि की एक सटीक प्रतिलिपि का उत्पादन में ।readlines()writelines()f2.writelines(f.readlines())ff2


1
ध्यान दें कि [line.rstrip('\n') for line in file]एक से अधिक ट्रेलिंग को हटा देगा \n
वेस टर्नर

1
अधिक बस, [line[:-(line[-1] == '\n') or len(line)+1] for line in file]इसके बजाय हो सकता है [line[:-(line[-1] == '\n') or None] for line in file]
वेस टर्नर

10
ये समाधान संपूर्ण फ़ाइल को मेमोरी में पढ़ते हैं। कोष्ठक को समझने वाली सूची के वर्ग कोष्ठक को बदलने से एक जनरेटर अभिव्यक्ति होती है जो आपको एक समय में फ़ाइल एक पंक्ति पर पुनरावृति करने देती है: for line in (x.strip() for x in f):
जोसेफ शीडी

2
@velotron वास्तव में प्रश्न / उत्तर की बात नहीं है। इसके अलावा: ध्यान रखें कि withब्लॉक समाप्त होने पर फाइलें बंद हो जाती हैं, जिसका मतलब है कि आप ऐसा नहीं कर सकते हैं with open(...) as f: lines = (line for line in f)और इसका उपयोग linesबाहर कर सकते हैं withक्योंकि आपको I / O त्रुटि मिलेगी। आप एक जीनएक्सपी का उपयोग करके आलसी हो सकते हैं, लेकिन आपको फ़ाइल बंद करने से पहले इसका उपभोग करना होगा।
बकुरीउ २०'१

@WesTurner। लेकिन वहाँ एक से अधिक अनुगामी newline नहीं होगा। अतिरिक्त न्यूलाइन अगली खाली लाइन का हिस्सा होगा
मैड फिजिसिस्ट

38
temp = open(filename,'r').read().split('\n')

14
\r\nहालांकि नई कहानियों के साथ क्या होगा ? ;)
वोल्फ

26
पायथन स्वचालित रूप से सार्वभौमिक न्यूलाइन्स को संभालता है, इस प्रकार न्यूलाइन .split('\n')कन्वेंशन के स्वतंत्र रूप से सही विभाजन करेगा। यदि आप फ़ाइल को बाइनरी मोड में पढ़ते हैं तो यह मायने रखता है। उस मामले में splitlines()सार्वभौमिक नईलाइन्स को संभालता है जबकि split('\n')ऐसा नहीं करता है।
बकुरीउ सिप

7
और हमेशा os.linesep:) :)
Askewchan

1
@ लार्स, यह कुछ परिस्थितियों में मदद करेगा, मेरे सिस्टम \r\nलाइन एंडिंग में परिवर्तित नहीं होते हैं \n, चाहे पाठ या बाइनरी के रूप में पढ़ा जाए, इसलिए os.linesepजहां \nकाम नहीं करता है। लेकिन splitlinesस्पष्ट रूप से बेहतर विकल्प है, जिस मामले में आप उल्लेख करते हैं कि फ़ाइल ओएस से मेल नहीं खाती है। वास्तव में मैंने ज्यादातर इसका उल्लेख किया है जब लोग इस चर्चा को देख रहे थे और इसके अस्तित्व से अनजान थे।
Askewchan

1
@askewchan शायद आप पायथन के पुराने संस्करण का उपयोग कर रहे हैं। मेरा मानना ​​है कि पायथन 3 के रूप में, सार्वभौमिक नईलाइन्स डिफ़ॉल्ट रूप से सक्षम होती हैं अर्थात \r\nजब आप लिनक्स पर चल रहे होते हैं तब भी पाठ फ़ाइलों के लिए परिवर्तित हो जाएंगे।
आर्थर टाका

13

एक और उदाहरण:

उस समय फ़ाइल को एक पंक्ति में पढ़ना। स्ट्रिंग के अंत से अवांछित चार्ट को हटानाstr.rstrip(chars)

with open(filename, 'r') as fileobj:
    for row in fileobj:
        print( row.rstrip('\n') )

यह भी देखें str.strip([chars])औरstr.lstrip([chars])

(अजगर> = 2.0)



9

मुझे लगता है कि यह सबसे अच्छा विकल्प है।

temp = [line.strip() for line in file.readlines()]

8
यह समाधान अग्रणी और अनुगामी रिक्त स्थान को भी हटा देता है, जिसका इरादा नहीं है।
रोलैंड इलिग

समझ वास्तव में अच्छा है, हालांकि। कम से कम पायथन 3 के साथ, कोई भी ऐसा उपयोग temp = [line.rstrip() for line in file.readlines()]कर सकता है जो @Roland_Illig नोट्स का इरादा रखता हो।
बबल्डेव ०२५

यदि आप सभी लाइनों पर पुनरावृति करने जा रहे हैं, तो आलसी क्यों नहीं? के साथ .readlines(), आप पूरी फ़ाइल पर दो बार प्रभावी रूप से पुनरावृत्ति कर रहे हैं।
एएमसी

1

इसे इस्तेमाल करे:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  

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

मैं नहीं देखता कि क्यों किसी को इसका उपयोग कुछ वैकल्पिक समाधानों पर करना चाहिए।
एएमसी

-1
my_file = open("first_file.txt", "r")
for line in my_file.readlines():
    if line[-1:] == "\n":
        print(line[:-1])
    else:
        print(line)
my_file.close() 

3
कृपया कुछ स्पष्टीकरण जोड़ें ताकि यह दूसरों के लिए उपयोगी हो।
samuellawrentz

आपको फ़ाइल ऑब्जेक्ट को संभालने के लिए एक संदर्भ प्रबंधक का उपयोग करना चाहिए, और सीधे फ़ाइल पर पुनरावृति करना चाहिए। .readlines()इस तरह का उपयोग करके , आप पूरी फ़ाइल पर दो बार प्रभावी रूप से पुनरावृत्ति कर रहे हैं।
एएमसी

-2
import csv

with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])

2
लेकिन क्या होगा अगर लाइन में एक अल्पविराम है?
गिल्च

-8
def getText():
    file=open("ex1.txt","r");

    names=file.read().split("\n");
    for x,word in enumerate(names):
        if(len(word)>=20):
            return 0;
            print "length of ",word,"is over 20"
            break;
        if(x==20):
            return 0;
            break;
    else:
        return names;


def show(names):
    for word in names:
        len_set=len(set(word))
        print word," ",len_set


for i in range(1):

    names=getText();
    if(names!=0):
        show(names);
    else:
        break;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.