पायथन में फ़ाइल की सामग्री को पढ़ने / लिखने का सबसे आसान तरीका


83

रूबी में आप का उपयोग कर एक फ़ाइल से पढ़ सकते हैं s = File.read(filename)। सबसे छोटा और स्पष्ट मुझे पता है कि पायथन में है

with open(filename) as f:
    s = f.read()

क्या ऐसा करने का कोई अन्य तरीका है जो इसे और भी कम कर देता है (अधिमानतः एक पंक्ति) और अधिक पठनीय?

नोट: शुरू में मैंने प्रश्न को "कोड की एक पंक्ति में ऐसा करना" कहा था। जैसा कि एस.लॉट द्वारा बताया गया है, छोटे का मतलब अधिक पठनीय नहीं है। इसलिए मैंने अपने प्रश्न को स्पष्ट करने के लिए कहा कि मेरा क्या मतलब है। मुझे लगता है कि रूबी कोड बेहतर और अधिक पठनीय है जरूरी नहीं क्योंकि यह एक पंक्ति बनाम दो (हालांकि यह भी मायने रखता है), लेकिन यह भी क्योंकि यह एक वर्ग विधि है उदाहरण के लिए विधि के विपरीत, जो फ़ाइल को बंद करने के बारे में कोई प्रश्न नहीं बनाता है, यह सुनिश्चित करने के लिए कि कोई अपवाद उठाए जाने पर भी यह बंद हो जाता है, आदि। जैसा कि नीचे दिए गए उत्तरों में बताया गया है, आप अपनी फाइल को बंद करने के लिए जीसी पर भरोसा कर सकते हैं (इस प्रकार इसे एक-लाइनर बना सकते हैं), लेकिन यह कोड को और भी बदतर बना देता है। हालांकि यह छोटा है। न केवल अस्थिर होने से, बल्कि अस्पष्ट बनाकर।


7
अपना खुद का फंक्शन बनाएं। फिर आप सामग्री प्राप्त करने के लिए इसका उपयोग कर सकते हैं। कॉल एक लाइन की होगी।
— फेलिक्स क्लिंग सेप

1
बस जिज्ञासु, क्या रूबी बयान फ़ाइल को भी बंद कर देता है?
— धीरोसौर

8
-1: कोड गोल्फ में कोई नहीं जीतता।
— सल्ट

4
मेरा सवाल मेरे लिए मायने रखता है। मैं इन दो पंक्तियों को लिखने का एक बेहतर तरीका खोजने की कोशिश कर रहा हूं ( with2.5 में बयान से पहले 4 पंक्तियां )। शायद वहाँ एक रास्ता है, शायद वहाँ नहीं है। मैं हमेशा पता लगाने की कोशिश कर सकता हूं, है ना? यदि आप इसे पसंद नहीं करते हैं, तो नीचे जाएं और आगे बढ़ें। :)
— ibz

1
इसका लाभ File.readlines("filename")यह है कि यह अपने नाम की गई फ़ाइल की सामग्री को पढ़ता है। सबूतों में कहीं भी कोई फाइल हैंडल, डिस्क्रिप्टर या ऑब्जेक्ट नहीं है। मेरे द्वारा देखे गए सभी पायथन "समतुल्य" में एक स्पष्ट खुला / बंद (या इससे भी बदतर, एक अंतर्निहित खुला जिसमें एक स्पष्ट करीब की आवश्यकता होती है) शामिल है।
— मार्क रीड

जवाबों:


12

यदि आप पुस्तकालयों का उपयोग करने के लिए खुले हैं, तो forked-path (easy_install या pip के साथ) स्थापित करने का प्रयास करें ।

तो आप कर सकते हैं:

from path import path
s = path(filename).bytes()

यह पुस्तकालय काफी नया है, लेकिन यह एक पुस्तकालय का एक कांटा है जो वर्षों से पायथन के आसपास तैर रहा है और इसका काफी उपयोग किया गया है। जब से मैं इस पुस्तकालय साल पहले मिल गया है, मैं बहुत ही कम उपयोग करें os.pathया open()किसी भी अधिक।


एक अच्छी लाइब्रेरी लगती है। मैं इसे सिर्फ इसके लिए स्थापित नहीं करूंगा, लेकिन मैं इसे ध्यान में रखूंगा।
— ibz

1
मुझे नहीं लगता कि यह स्वीकार किया गया जवाब था क्योंकि यह कुल हैक है!
— निकोलय

विंडोज पर पाइप 18.6 द्वारा स्थापित फोर्क्ड-पथ v0.2.3 पायथन 3.6.4 के साथ संगत नहीं है। ऑक्टल स्थिरांक (जैसे के 0777बजाय 0o0777) के लिए उपयोग किए जाने वाले प्रारूप की तरह लगता है कि मेरे वर्तमान पायथन संस्करण द्वारा समर्थित नहीं है।
— क्रिस्टोफर सोप

+1 से एयाल लेविन का उत्तर । यदि 8 साल पहले मूल रूप से इसका जवाब देने पर पाथलिब या पाथलिब 2 मौजूद था, तो मैंने उन्हें फोर्क-पाथ के बजाय उल्लेख किया होगा। मैंने सालों में फोर्क-पाथ का इस्तेमाल नहीं किया है।
— स्नैपशॉट


43

यह ऊपर जैसा है लेकिन त्रुटियों को नहीं संभालता है:

s = open(filename, 'r').read()

21
नहीं, वास्तव में, आपका फ़ाइल खुला छोड़ देता है।
— zबज

3
CPython कार्यान्वयन फ़ाइल को बंद कर देता है जब संदर्भ गणना शून्य पर जाती है, लेकिन यह एक कार्यान्वयन विवरण है जिस पर भरोसा नहीं किया जाना चाहिए।
— मार्क टोलेनेन

1
यह त्रुटियों को संभालता है; एक अपवाद हमेशा की तरह फेंक दिया जाएगा। यह "फ़ाइल को खुला नहीं छोड़ता है", लेकिन यह क्या कर सकता है जिससे फ़ाइल जीसी कार्यान्वयन के आधार पर देरी हो सकती है। यह एक समस्या हो सकती है (विंडोज में लॉकिंग, और उदाहरण के लिए। एफडी सीमाएं यदि कई फाइलों पर लूपिंग होती हैं), लेकिन यह फ़ाइल को खुला छोड़ने से बहुत अलग है (जैसे फ़ाइल को लीक करना)।
— ग्लेन मेनार्ड

11
यदि आपका डिज़ाइन लक्ष्य "कोड की एक पंक्ति" है, तो आपने बहुत अधिक पर्ल प्राप्त कर लिया है और आपको कुछ गंभीर अन-ब्रेनवॉशिंग समय निर्धारित करने की आवश्यकता है।
— ग्लेन मेनार्ड

6
नहीं, यह थोड़ी सी भी गड़बड़ नहीं है।
— ग्लेन मेनार्ड

37

Pathlib का उपयोग करें ।

पायथन 3.5 और ऊपर:

from pathlib import Path
contents = Path(file_path).read_text()

पायथन के निचले संस्करणों के लिए pathlib2 का उपयोग करें :

$ pip install pathlib2

फिर

from pathlib2 import Path
contents = Path(file_path).read_text()

लिखना उतना ही आसान है:

Path(file_path).write_text('my text')

18
contents = open(filename).read()

9
और आप फाइल कब बंद करते हैं?
— zबज

1
@ionut bizau - जब open(...)कूड़े की वापसी होती है, तो मुझे लगता है। किसी ने गलत होने पर मुझे सही किया।
— 9

1
यह इसे करने का सबसे छोटा तरीका है। मुझे नहीं पता कि इसके पास कोई वोट क्यों नहीं है।
— प्रितेश आचार्य

10

यह पर्ल नहीं है; आप एक लाइन पर कोड के लायक कई लाइनों को फिट करने के लिए मजबूर नहीं करना चाहते हैं। एक फ़ंक्शन लिखें, फिर फ़ंक्शन को कॉल करना कोड की एक पंक्ति लेता है।

def read_file(fn):
    """
    >>> import os
    >>> fn = "/tmp/testfile.%i" % os.getpid()
    >>> open(fn, "w+").write("testing")
    >>> read_file(fn)
    'testing'
    >>> os.unlink(fn)
    >>> read_file("/nonexistant")
    Traceback (most recent call last):
        ...
    IOError: [Errno 2] No such file or directory: '/nonexistant'
    """
    with open(fn) as f:
        return f.read()

if __name__ == "__main__":
    import doctest
    doctest.testmod()

5

धीमा, बदसूरत, प्लेटफ़ॉर्म-विशिष्ट ... लेकिन एक-लाइनर ;-)

import subprocess

contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0]

4
aaaaaaaaaaargh! (अतिरिक्त 'मिन से चार सीमा को पूरा करने के लिए)
— पीटर गिब्सन

6
निश्चित रूप से सवाल की भावना से मेल खाता है ... इसे फिर से बनाने के लिए पाइथन का विकृत उपयोग बश के रूप में रूबी या पर्ल से मिलता जुलता नहीं है।
— 7

3

सरल जैसे की वह:

    f=open('myfile.txt')
    s=f.read()
    f.close()

और जो कुछ भी आप चाहते हैं वह सामग्री "s" के साथ करें


-1
contents = open(filename)

यह आपको जनरेटर प्रदान करता है ताकि आपको कहीं और मूल्यों को सहेजना पड़े, या

contents = [line for line in open(filename)]

यह स्पष्ट करीबी सूची को बचाने के लिए संभव नहीं है (कम से कम मेरे ज्ञान के साथ पायथन)।


1
और सामग्री के साथ = '' .join (लाइन फॉर लाइन इन ओपन (फाइलनाम)) आपके पास मूल फ़ाइल सामग्री है ...
— eumiro

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

@Glenn लेकिन अगर आप मेरे उदाहरण की तरह सूची समझ में जनरेटर का उपयोग करते हैं, तो इसे बंद करना भी संभव नहीं है क्योंकि इसका नाम नहीं है।
— टोनी वेजालिनेन

"इसे बंद करने में सक्षम नहीं होना" समान नहीं है क्योंकि "इसे बंद करने की आवश्यकता नहीं है"।
— ग्लेन मेनार्ड

शायद इसलिए लेकिन आपको नहीं पता होगा कि अंदर की समझ से उस फ़ाइल को कैसे एक्सेस करना है। शायद पायथन में 'सभी फ़ाइल i / o समाप्त हो जाए, सभी प्रोग्राम ओपन फ़ाइल बंद' कमांड हो जाए? या शायद फ़ाइल वस्तुओं के लिए स्पष्ट जीसी पर्याप्त होगा? फ़ाइल संभाल हालांकि दायरे से बाहर है क्योंकि सूची की समझ अलग गुंजाइश है।
— टोनी वेजालिनेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.