2012-05-04 27 views
8

के अंदर प्रिंट करते समय आउटपुट में अतिरिक्त पंक्ति मुझे पता नहीं लगा सकता कि कोड # 1 कोड # 2 नहीं होने पर अतिरिक्त खाली रेखा क्यों देता है। क्या कोई इसे समझा सकता है? कोड # 2 के अंत में अंतर एक अतिरिक्त कॉमा है।लूप

(2) line 2 

(3) line 3 

(4) line 4 

कोड # 2 (वांछित परिणाम) से परिणाम::

line 1 
line 2 
line 3 
line 4 
line 5 

कोड # 1 से परिणाम:

# Code #1 
file = open('tasks.txt') 

for i, text in enumerate(filer, start=1): 
    if i >= 2 and i <= 4: 
     print "(%d) %s" % (i, text) 

# Code #2 
file = open('tasks.txt') 

for i, text in enumerate(filer, start=1): 
    if i >= 2 and i <= 4: 
     print "(%d) %s" % (i, text), 

यहाँ मेरी tasks.txt फ़ाइल की सामग्री है

(2) line 2 
(3) line 3 
(4) line 4 

उत्तर

13

पिछला , प्रिंट स्टेटमेंट एक लाइन फीड को दबाएगा। आपके पहले प्रिंट स्टेटमेंट में कोई नहीं है, आपका दूसरा ऐसा करता है।

आपके द्वारा पढ़े गए इनपुट में अभी भी \n है जो अतिरिक्त लाइनफ़ेड का कारण बनता है। इसके लिए क्षतिपूर्ति करने का एक तरीका है पिछला कॉमा का उपयोग कर प्रिंट को अपने आप से लाइनफीड जारी करने से रोकना। वैकल्पिक रूप से, और तर्कसंगत रूप से एक बेहतर दृष्टिकोण, जब आप इसे पढ़ते हैं तो इनपुट में नई लाइन को पट्टी कर सकते हैं (उदाहरण के लिए, rstrip() का उपयोग करके)

+0

धन्यवाद, मुझे इसके बारे में पता नहीं था। मैंने बस इसे देखा। ऐसा लगता है जैसे पायथन 3.0 में प्रिंट करने के लिए कुछ अतिरिक्त सुविधाएं शामिल हैं। अगर मैं इसे सही समझता हूं तो आप पाइथन 3.0+ में अपनी लाइन को समाप्त करने के तरीके को परिभाषित कर सकते हैं [इसे यहां मिला] (http://docs.python.org/release/3.1.5/whatsnew/3.0.html#print-is-a -समारोह)। और गलती को इंगित करने के लिए धन्यवाद, हाँ मेरा मतलब कोड # 2 था। फिक्स्ड। – finspin

+0

@ जारो आप सही हैं, दस्तावेज़ों में सेक्शन पाइथन 2.x और 3.x के बीच प्रिंट के लिए प्रासंगिक अंतर को इंगित करता है। – Levon

1

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

फ़ाइल अर्थशास्त्र का परीक्षण करने का एक अच्छा तरीका StringIO के साथ है। एक नज़र डालें:

>>> from StringIO import StringIO 
>>> x = StringIO("abc\ncde\n") 
>>> for line in x: print repr(line) 
... 
'abc\n' 
'cde\n' 

अल्पविराम प्रिंट से न्यू लाइन को दबा, के रूप में लेवोन कहते हैं, इतना है कि वहाँ स्ट्रिंग से केवल न्यू लाइन।

मैं s.rstrip('\n') का उपयोग कर स्ट्रिंग से न्यूलाइन को पट्टी करता हूं। यह किसी भी आधुनिक प्रारूप (यूनिक्स, विंडोज, या पुराने मैक ओएस) में किसी भी पिछली न्यूलाइन से छुटकारा पाता है। तो आप इसके बजाय print "(%d) %s" % (i, text.rstrip('\n')) कर सकते हैं।

+0

टिप के लिए धन्यवाद! – finspin

+0

-1 यदि (जैसा कि आप होना चाहिए) तो आप टेक्स्ट मोड में फ़ाइल खोल रहे हैं, लाइन विभाजक को '' \ n'' में बदल दिया जाएगा, इसलिए आपको केवल '.rstrip (' \ n ') 'की आवश्यकता है। यदि यह आपकी रेखा के अंत में '' r'' छोड़ देता है, तो वह '' r'' आपके ** डेटा ** का हिस्सा है, संभवतः फ़ाइल के निर्माता के परिणामस्वरूप कुछ उलझन में है। –

+1

@ जॉन आप गलत हैं। लाइन विभाजक विंडोज़ पर '\ r \ n' से '\ n' में बदलता है, लेकिन यूनिक्स पर नहीं। यही है: यदि आप जो भी सुझाव देते हैं, वही फाइलें अलग-अलग ओएस पर अलग-अलग व्यवहार करती हैं। हो सकता है कि हम यही चाहते हैं, लेकिन यह आपने नहीं कहा है। अगर हम 'आरयू' के साथ पढ़ते हैं, हालांकि, वे वही पढ़ते हैं, और फिर '\ r' को दूर करना जरूरी नहीं है। –

2

आदेश एक रिक्त पंक्ति नहीं करने के लिए आपको प्रिंट बयान के अंत में , जरूरत

उदाहरण:

for i in range(10): 
    print i, 

>>>0 1 2 3 4 5 6 7 8 9 

for i in range(10): 
    print i 

>>> 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
+1

** python3 ** में यह 'i श्रेणी के लिए होगा (10): प्रिंट (i, end =" ")' – erik

3

सबसे अच्छा सामान्य इस समस्या का जवाब अनुगामी पट्टी है जैसे ही आप इसे पढ़ते हैं, नई लाइन (यदि कोई हो!):

f = open('tasks.txt') 
for i, text in enumerate(f, start=1): 
    text = text.rstrip('\n') 
    if i >= 2 and i <= 4: 
     print "(%d) %s" % (i, text) 

इस तरह आप अपने इनपुट से अपने आउटपुट को बेकार कर देते हैं .. आपका आउटपुट कोड 20 लाइनों या एक अलग फ़ंक्शन/विधि या यहां तक ​​कि एक अलग मॉड्यूल में भी हो सकता है। प्रिंट स्टेटमेंट के अंत में अल्पविराम का उपयोग करके इनपुट में एक नई लाइन के लिए मुआवजा एक मजबूत समाधान नहीं है।

1

इसके लिए एक बहुत ही सरल तय है।

मान लें कि मेरे पास तर्क है, एक .txt फ़ाइल (संख्याएं कहा जाता है।तब

234234 
777776 
768768 

, निम्नलिखित कोड का उपयोग कर: txt) मैं मूल्यों के साथ से पढ़ने जो कर रहा हूँ

filename = numbers.txt 

with open(filename) as file_object: 
    for line in file_object: 
     print(line) 

के रूप में आप के साथ समस्या हो रही है आप अतिरिक्त रिक्त पंक्ति देंगे। लेकिन एक छोटे से बदलाव के साथ, आप rstrip() विधि का उपयोग कर अतिरिक्त खाली लाइनों से छुटकारा पा सकते हैं। तो कोड बन जाता है:

filename = numbers.txt 

with open(filename) as file_object: 
    for line in file_object: 
     print(line.rstrip()) 

अब आप उनके बीच उन परेशान खाली रेखाओं के बिना परिणाम प्राप्त करेंगे!