2013-08-03 5 views
10

के लिए इनपुट फ़ाइल अतिरिक्त न्यू लाइन जोड़ रहा है: a.txtअजगर उत्पादन

aaaaaaaaaaaa 
bbbbbbbbbbb 
cccccccccccc 

अजगर कोड:

with open("a.txt") as f: 
    for line in f: 
     print line 

समस्या:

[[email protected] 0]# python read_lines.wsgi 
aaaaaaaaaaaa 

bbbbbbbbbbb 

cccccccccccc 

आप उत्पादन देख सकते हैं प्रत्येक आइटम के बीच अतिरिक्त रेखा है।

इसे कैसे रोकें?

उत्तर

12

print एक नई पंक्ति जोड़ देती है, और इनपुट लाइनों पहले से ही एक नई पंक्ति के साथ खत्म।

import sys 

with open("a.txt") as f: 
    for line in f: 
     sys.stdout.write(line) 

पुनश्च: अजगर 3 (या प्रिंट समारोह के साथ अजगर 2) के लिए, abarnert के print(…, end='') समाधान सरल एक है

एक मानक समाधान उत्पादन के लिए शब्दशः इनपुट लाइनों है।

+0

ओपी स्पष्ट रूप से पायथन 2 का उपयोग कर रहा है, और मुझे यकीन नहीं है कि 2.x उपयोगकर्ताओं के लिए 'print_function' का सुझाव हमेशा एक अच्छा विचार है। और 'प्रिंट' के जादू नरम स्थान का उपयोग करना शायद एक बुरा विचार है यदि आप पहले नहीं सीखते कि इसका क्या अर्थ है और यह कैसे काम करता है। जिसका अर्थ है कि आपका स्पष्ट 'लेखन' सबसे अच्छा जवाब हो सकता है (यही कारण है कि मैंने आपका जवाब उखाड़ फेंका, और लगता है कि ओपी इसे स्वीकार करने का अधिकार था)। – abarnert

+0

आरईएफ https://docs.python.org/2/library/functions.html#print –

0

यह एक नई लाइन नहीं जोड़ रहा है, लेकिन आपकी फ़ाइल से प्रत्येक स्कैन की गई रेखा एक पिछली है।

प्रयास करें:

with open ("a.txt") as f: 
    for line in (x.rstrip ('\n') for x in f): 
     print line 
+0

यह विंडोज़ (या ओएस एक्स से पहले मैक ओएस) पर विफल रहता है, क्योंकि न्यूलाइन कैरेक्टर '\ n' नहीं है। – EOL

+1

यह भी विफल रहता है अगर फ़ाइल a.txt मौजूद नहीं है। – Hyperboreus

+1

@EOL AFAIK, और मैं गलत हो सकता हूं, पाइथन में टेक्स्ट मोड में खोले गए फाइलों में उनकी सभी लाइन-एंडिंग पूरी तरह से '\ n' में परिवर्तित हो गई हैं। – Hyperboreus

2

क्या होता है कि अंत में एक नई पंक्ति, और अजगर में print बयान के रूप में प्रत्येक पंक्ति भी एक नई पंक्ति जोड़ता है। आप नई-पंक्तियों पट्टी कर सकते हैं:

with open("a.txt") as f: 
    for line in f: 
     print line.strip() 
+0

'स्ट्रिप() 'अग्रणी सफेद रिक्त स्थान भी हटा देता है, इसलिए यह समाधान इनपुट फ़ाइल को सही ढंग से मुद्रित करने में विफल रहता है जब इसमें रिक्त स्थान से शुरू होने वाली रेखाएं होती हैं। आप वास्तव में 'rstrip() 'चाहते हैं। यहां तक ​​कि 'rstrip() 'इतना अच्छा नहीं है: यह न्यूलाइन (जो अच्छा है) को हटा देता है, लेकिन पीछे की जगहों को भी पीछे हटता है, जो कुछ संभावित अवांछित तरीके से इनपुट फ़ाइल की रेखाओं को संशोधित करता है, इसलिए एक' rstrip() 'संस्करण भी नहीं है पूरी तरह से क्या जरूरत है। – EOL

1

तुम भी splitlines() समारोह की कोशिश कर सकते, यह स्वतः ही स्ट्रिप्स:

f = open('a.txt').read() 
for l in f.splitlines(): 
    print l 
+1

हालांकि यह पाइथन 2 और पायथन 3 दोनों में कई ऑपरेटिंग सिस्टम के विभिन्न न्यूलाइन सम्मेलन को सही ढंग से संभालता है, यह समाधान बहुत मेमोरी ले सकता है : स्मृति में पूरी फ़ाइल न केवल पढ़ी जाती है, बल्कि इसकी प्रतियों की सूची के माध्यम से एक प्रतिलिपि बनाई जाती है। तो, यह एक तरीका है जो काम करता है, लेकिन केवल उन फ़ाइलों के लिए जो बहुत बड़े नहीं हैं।ध्यान दें कि अंततः स्मृति को मुक्त किया जाएगा यदि इस समाधान ने 'अन्य' के साथ उपयोग किया, जैसे कि कुछ अन्य उत्तरों में। – EOL

+0

@EOL: 'with'' मुक्त स्मृति को प्रभावित नहीं करेगा। चाहे आप फ़ाइल बंद कर दें या नहीं, विशाल 'f' स्ट्रिंग बिल्कुल उसी समय के लिए लाइव है। (बेशक यह अभी भी एक अच्छा विचार है कि फाइल हैंडल को रिसाव न करें। यह सिर्फ जीसीइंग 'एफ', या' f.splitlines' के लिए प्रासंगिक नहीं है।) – abarnert

+0

@ बार्नर्ट: आप सही हैं। मुझे यकीन नहीं है कि मैंने क्यों लिखा है कि स्मृति 'साथ' से मुक्त हो जाएगी (शामिल स्मृति राशि वास्तव में नगण्य है)। – EOL

6

के रूप में अन्य उत्तर की व्याख्या, प्रत्येक पंक्ति एक नई पंक्ति है; जब आप print एक नंगे स्ट्रिंग करते हैं, तो यह अंत में एक पंक्ति जोड़ता है। इसके चार तरीके हैं; बाकी सब कुछ एक ही दो विचारों पर एक भिन्नता है।


सबसे पहले, आप नई-पंक्तियों पट्टी कर सकते हैं के रूप में आप उन्हें पढ़ने:

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip() 

यह किसी अन्य पिछली श्वेत रिक्ति, रिक्त स्थान या टैब की तरह है, साथ ही न्यू लाइन हटेगा। आमतौर पर आपको इसकी परवाह नहीं है।

with open("a.txt", "rU") as f: 
    for line in f: 
     print line.rstrip('\n') 

हालांकि, अगर आप जानते हैं कि पाठ फ़ाइल हो जाएगा, कहते हैं, एक Windows- न्यू लाइन फ़ाइल, या एक देशी-टू: यदि आप करते हैं, तो आप शायद सार्वभौमिक न्यू लाइन मोड का उपयोग करने, और बंद पट्टी नई-पंक्तियों चाहते -whichever मंच-मैं से चल-ऑन-राइट अब न्यू लाइन फ़ाइल, आप उचित अंत स्पष्ट रूप से पट्टी कर सकते हैं:

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip('\r\n') 

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip(os.linesep) 

यह करने के लिए अन्य तरीके से मूल न्यू लाइन छोड़ने के लिए है , और सिर्फ एक अतिरिक्त प्रिंटिंग से बचें। जबकि आप sys.stdout पर sys.stdout.write(line) के साथ लिखकर ऐसा कर सकते हैं, तो आप इसे print से भी कर सकते हैं।

यदि आप एक नई लाइन प्रिंट करने के बजाय print कथन के अंत में एक अल्पविराम जोड़ते हैं, तो यह एक "स्मार्ट स्पेस" जोड़ता है। Exactly what that means थोड़ा मुश्किल है, लेकिन विचार यह माना जाता है कि यह एक जगह जोड़ता है जब इसे चाहिए, और जब कुछ भी नहीं होना चाहिए। सबसे DWIM एल्गोरिदम की तरह, यह हमेशा चीज़ों नहीं मिलता है राइट लेकिन इस मामले में, यह करता है:

with open("a.txt") as f: 
    for line in f: 
     print line, 

बेशक अब हम यह सोचते हैं कर रहे हैं कि फाइल की नई-पंक्तियों आपके मेल खाते हैं terminal's-यदि आप के साथ इस कोशिश, यूनिक्स टर्मिनल पर क्लासिक मैक फाइलें कहें, आप अंतिम पंक्ति पर प्रत्येक लाइन प्रिंटिंग के साथ समाप्त हो जाएंगे। फिर, आप सार्वभौमिक न्यूलाइन का उपयोग कर इसके आसपास हो सकते हैं।

वैसे भी, आप प्रिंट स्टेटमेंट के बजाय प्रिंट फ़ंक्शन का उपयोग करके स्मार्ट स्पेस के डीडब्ल्यूआईएम जादू से बच सकते हैं। अजगर 2.x में, आप एक __future__ घोषणा का उपयोग करके इस प्राप्त:

from __future__ import print_function 
with open("a.txt") as f: 
    for line in f: 
     print(line, end='') 

या यदि आप चाहें तो आप six की तरह एक तीसरे पक्ष के आवरण लाइब्रेरी का उपयोग कर सकते हैं।

+0

स्ट्रिपिंग '\ r' बेकार है क्योंकि आपने फ़ाइल को टेक्स्ट मोड में खोला है: '\ r' char हटा दिया गया है _before_ आपको इसे पट्टी करना है। पाठ फ़ाइलों के लिए केवल अजगर 2 और बाइनरी मोड के साथ उपयोगी (पायथन 3 के साथ संगत नहीं) –

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