किसी फ़ाइल की केवल पहली पंक्ति पढ़ें?


208

आप पायथन के साथ एक स्ट्रिंग के रूप में फ़ाइल की केवल पहली पंक्ति कैसे प्राप्त करेंगे?


4
यदि आपने पहले ही फ़ाइल ("फ़ाइल में पढ़ने के बाद") पढ़ ली है, तो आप पहली पंक्ति पढ़ चुके हैं! (यह मानते हुए कि कम से कम एक लाइन है।)
विलियम पर्ससेल

3
ध्यान दें कि अब प्रश्न का शब्द मूल अर्थ की तुलना में एक अलग अर्थ है। कुछ जवाब अब मूर्खतापूर्ण लगते हैं क्योंकि उन्होंने "फ़ाइल में पढ़ने के बाद" भाग (जो हटा दिया गया है) को ध्यान में रखा।
पीटर हैन्सन

जवाबों:


354

.readline()विधि का उपयोग करें ( पायथन 2 डॉक्स , पायथन 3 डॉक्स ):

with open('myfile.txt') as f:
    first_line = f.readline()

कुछ नोट:

  1. डॉक्स में नोट किया गया है, जब तक कि यह फ़ाइल में एकमात्र पंक्ति नहीं है, तब से लौटे स्ट्रिंग f.readline()में एक अनुगामी नई रेखा होगी। आप f.readline().strip()नई पंक्ति को हटाने के बजाय उपयोग करना चाह सकते हैं ।
  2. withबयान स्वचालित रूप से फिर से जब ब्लॉक समाप्त होता है फ़ाइल बंद कर देता है।
  3. withबयान केवल अजगर 2.5 और ऊपर में काम करता है, और अजगर 2.5 में आप उपयोग करने की जरूरत हैfrom __future__ import with_statement
  4. पायथन 3 में आपको अपने द्वारा खोली गई फ़ाइल के लिए फ़ाइल एन्कोडिंग निर्दिष्ट करना चाहिए। अधिक पढ़ें...

3
पायथन 3 में यदि फ़ाइल ascii या utf8 है तो आपको फ़ाइल एन्कोडिंग निर्दिष्ट करने की आवश्यकता नहीं है। और अगर यह नहीं है तो आपको पाइथन 2 में कोडेक्सोपेन को एन्कोडिंग निर्दिष्ट करना चाहिए।
इवपोक

2
@Evpok "पायथन 3 में यदि फ़ाइल ascii या utf8 है तो आपको फ़ाइल एन्कोडिंग निर्दिष्ट करने की आवश्यकता नहीं है" - यदि केवल वही सख्ती से सच था! वास्तविकता थोड़ी अधिक गड़बड़ है; डॉक्स में उल्लेख किया गया है, उपयोग की जाने वाली डिफ़ॉल्ट एन्कोडिंग प्लेटफ़ॉर्म-निर्भर है (और उसी कंप्यूटर पर भिन्न भी हो सकती है कि आप पायथन को कैसे लॉन्च करते हैं, इस पर निर्भर करता है - उदाहरण के लिए, मैंने कोड देखा है जो UTF-8 मानकर मेरे सामान्य शेल में काम करता है। जब अपाचे के माध्यम से चला mod_wsgi)।
मार्क अमेरी


20
fline=open("myfile").readline().rstrip()

मैं यहां इसी की तलाश में आया था। खासकर जब rstrip()से न्यूलाइन कैरेक्टर हटाता है।
शशांक सावंत

5
-1; यह फ़ाइल बंद नहीं करता है, और एक गलत परिणाम देता है यदि पहली पंक्ति में कोई भी अनुगामी व्हॉट्सएप है जो कि केवल नई वर्ण के अलावा है।
मार्क अमेरी

@MarkAmery: वास्तव में, क्योंकि फ़ाइल हैंडल को वेरिएबल में असाइन नहीं किया गया है, यह तुरंत कचरा एकत्र किया जाता है, जो फ़ाइल को बंद कर देता है। (हालांकि, निश्चित रूप से, एक संदर्भ प्रबंधक का उपयोग करके स्वीकृत समाधान अभी भी बहुत बेहतर है।)
acdr

@acdr आप जो कहते हैं वह CPython के लिए सही है, लेकिन अन्य Python कार्यान्वयन के लिए नहीं - उदाहरण के लिए PyPy कचरा संग्रह डॉक्स जो कि ब्याज के एक विशेष बिंदु के रूप में उल्लेख करते हैं कि "फाइलें ... जब वे दायरे से बाहर जाते हैं तो तुरंत बंद नहीं होते हैं" । इस कारण से, यह आमतौर पर तर्क दिया जाता है (जैसे stackoverflow.com/a/7396043/1709587 ) जो आपके द्वारा बताए गए व्यवहार पर निर्भर है, वह बुरा अभ्यास है।
मार्क अमेरी


9

एक खुली फ़ाइल की शुरुआत में वापस जाने के लिए और फिर पहली पंक्ति में लौटें, यह करें:

my_file.seek(0)
first_line = my_file.readline()

1
बस बेहतर समझने के लिए, यह "my_file.seek (0) लाइन = my_file.readline ()" होगा
अल्बर्टो पेरेज

7
first_line = next(open(filename))

1
क्या यह फ़ाइल को बंद कर देता है?
अबल्टर

आखिरकार, जब पायथन ब्लॉक छोड़ देता है।
vy32

6

यहाँ अन्य उत्तरों के बहुत सारे, लेकिन आपके द्वारा पूछे गए प्रश्न का सटीक उत्तर देने से पहले (@MarkAmery गए और मूल प्रश्न को संपादित किया और अर्थ बदल दिया):

>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('\n', 1)[0]

दूसरे शब्दों में, यदि आप फ़ाइल में पहले से पढ़ चुके हैं (जैसा कि आपने कहा था), और मेमोरी में डेटा का एक बड़ा ब्लॉक है, तो इससे पहली पंक्ति को कुशलता से प्राप्त करने के लिए, एक बार न्यूलाइन वर्ण पर एक विभाजन करें () केवल, और परिणामी सूची से पहला तत्व लें।

ध्यान दें कि इसमें \nपंक्ति के अंत में वर्ण शामिल नहीं है , लेकिन मैं मान रहा हूं कि आप इसे वैसे भी नहीं चाहते हैं (और एकल-पंक्ति फ़ाइल में एक भी नहीं हो सकता है)। यह भी ध्यान दें कि यद्यपि यह बहुत छोटा और त्वरित है, यह डेटा की एक प्रतिलिपि बनाता है, इसलिए स्मृति की वास्तव में बड़ी बूँद के लिए आप इसे "कुशल" नहीं मान सकते हैं। हमेशा की तरह, यह निर्भर करता है ...


8
यदि यह एक बड़ी फ़ाइल है, तो f.read () संपूर्ण फ़ाइल को मेमोरी में लोड करने का प्रयास करेगा जो एक अच्छा विचार नहीं होगा। एक विकल्प एक समय में एक चरित्र को पढ़ने के लिए होगा जब तक कि एक नई
पंक्ति

वास्तव में, अन्य सभी उत्तर उससे बेहतर विकल्प हैं। आम तौर पर रीडलाइन () और दोस्तों के साथ एक फ़ाइल पढ़ने से एक बार में पूरे ब्लॉक लोड हो जाएंगे, हो सकता है कि 32K दे या ले जाए, और अगली न्यूलाइन खोजने के लिए उस के माध्यम से खोज करें। बहुत तेज और अधिक कुशल। मेरा उत्तर केवल तभी उपयोगी होगा जब वह पहले से ही पूरी चीज़ को लोड कर रहा हो, जिस स्थिति में हम यह मान सकते हैं कि वह स्मृति में यह सब होने के साथ ठीक है।
पीटर हैनसन

2
मुझे यकीन नहीं है कि मैंने अर्थ बदल दिया है। यह पूछने के लिए बहुत ही व्यर्थ है कि पूरी फ़ाइल को "पढ़ने" के बाद एक फ़ाइल से पहली पंक्ति को "कैसे" पढ़ा जाए। जैसे, यह मेरे लिए बहुत स्पष्ट है कि पूछने वाले का इरादा यह मानने का नहीं था कि .read()पहले बुलाया जाना चाहिए।
मार्क अमेरी

@MarkAmery, प्रश्न खराब शब्द ("बहुत अर्थहीन") था, इसलिए आपने इरादे का अनुमान लगाया ("मेरे लिए स्पष्ट") और इसे मिलान करने के लिए पुन: प्रस्तुत किया। मेरी व्याख्या अलग है। स्पष्ट रूप से जब तक और जब तक वीणावादक स्पष्ट नहीं करते हैं, तब तक हमारे पास सभी मूल शब्द हैं और उत्तर की उसकी स्वीकृति (अर्थात "तलाश (0)") जो मुझे स्पष्ट रूप से दिखाती है कि वह फ़ाइल में पहले ही पढ़ चुका था , कम से कम पहली पंक्ति में है।
पीटर हैनसेन

आपको यह उत्तर निकालना चाहिए। यह सही तरीका नहीं है और लोगों को बरगला सकता है।
थांग

-15
f1 = open("input1.txt", "r")
print(f1.readline())

20
पाँच साल से अधिक पुराने कई उत्तर हैं जिनमें यह दृष्टिकोण है । आप एक दूसरे को जोड़कर शोर मचाने के अलावा कुछ नहीं कर रहे हैं।
मार्क अमेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.