खोज…


परिचय

जब डेटा को स्टोर करना, पढ़ना या संचार करना आता है, तो पायथन के साथ ऑपरेटिंग सिस्टम की फाइलों के साथ काम करना आवश्यक और आसान दोनों होता है। अन्य भाषाओं के विपरीत जहां फ़ाइल इनपुट और आउटपुट के लिए जटिल रीडिंग और राइटिंग ऑब्जेक्ट की आवश्यकता होती है, पायथन फाइल को खोलने, पढ़ने / लिखने और बंद करने के लिए केवल कमांड की आवश्यकता को सरल करता है। यह विषय बताता है कि पायथन ऑपरेटिंग सिस्टम की फाइलों के साथ कैसे इंटरफेस कर सकता है।

वाक्य - विन्यास

  • file_object = open (फ़ाइल नाम [, access_mode] [, बफरिंग])

पैरामीटर

पैरामीटर विवरण
फ़ाइल का नाम आपकी फ़ाइल का पथ या, यदि फ़ाइल कार्यशील निर्देशिका में है, तो आपकी फ़ाइल का फ़ाइल नाम
एक्सेस मोड एक स्ट्रिंग मान जो यह निर्धारित करता है कि फ़ाइल कैसे खोली जाती है
बफरिंग वैकल्पिक लाइन बफ़रिंग के लिए पूर्णांक मान का उपयोग किया जाता है

टिप्पणियों

क्रॉस-प्लेटफॉर्म एन्कोडिंग नर्क से बचना

पायथन के बिल्ट-इन open() का उपयोग करते समय, हमेशा encoding तर्क को पारित करने के लिए सबसे अच्छा अभ्यास है, यदि आप अपने कोड को क्रॉस-प्लेटफॉर्म चलाने का इरादा रखते हैं। इसका कारण, यह है कि सिस्टम की डिफ़ॉल्ट एन्कोडिंग एक प्लेटफॉर्म से दूसरे प्लेटफॉर्म में भिन्न होती है।

जबकि linux सिस्टम डिफॉल्ट रूप में utf-8 उपयोग करते हैं, यह मैक और विंडोज के लिए जरूरी नहीं है।

सिस्टम की डिफ़ॉल्ट एन्कोडिंग की जाँच करने के लिए, इसे आज़माएँ:

import sys
sys.getdefaultencoding()

किसी भी अजगर दुभाषिया से।

इसलिए, यह हमेशा एक एन्कोडिंग को अलग करने के लिए समझदारी है, यह सुनिश्चित करने के लिए कि आप जिस स्ट्रिंग्स के साथ काम कर रहे हैं वह एन्कोडेड है क्योंकि आपको लगता है कि वे हैं, क्रॉस-प्लेटफॉर्म कॉम्पिटिटेरिटी सुनिश्चित करना।

with open('somefile.txt', 'r', encoding='UTF-8') as f:
    for line in f:
        print(line)

फ़ाइल मोड

अलग-अलग मोड हैं जिन्हें आप mode पैरामीटर द्वारा निर्दिष्ट के साथ एक फ़ाइल खोल सकते हैं। इसमें शामिल है:

  • 'r' - रीडिंग मोड। डिफ़ॉल्ट। यह आपको केवल फ़ाइल पढ़ने की अनुमति देता है, इसे संशोधित करने की नहीं। इस मोड का उपयोग करते समय फ़ाइल मौजूद होनी चाहिए।

  • 'w' - लेखन मोड। यह मौजूद नहीं है तो एक नई फ़ाइल बनाएगा, अन्यथा फ़ाइल को मिटा देगा और आपको इसे लिखने की अनुमति देगा।

  • 'a' - एपेंड मोड। यह फ़ाइल के अंत में डेटा लिखेगा। यह फ़ाइल को मिटाता नहीं है, और इस मोड के लिए फ़ाइल मौजूद होनी चाहिए।

  • 'rb' - बाइनरी में रीडिंग मोड। यह r समान है सिवाय इसके कि पठन बाइनरी मोड में मजबूर है। यह भी एक डिफ़ॉल्ट विकल्प है।

  • 'r+' - एक ही समय में रीडिंग मोड प्लस राइटिंग मोड। यह आपको r और w का उपयोग किए बिना एक ही समय में फ़ाइलों में पढ़ने और लिखने की अनुमति देता है।

  • 'rb+' - बाइनरी में पढ़ना और लिखना मोड। डेटा को छोड़कर r+ जैसा ही बाइनरी में है

  • 'wb' - बाइनरी में लेखन मोड। डेटा को छोड़कर w समान ही बाइनरी में है।

  • 'w+' - लेखन और पढ़ने का तरीका। r+ समान सटीक लेकिन यदि फ़ाइल मौजूद नहीं है, तो एक नया बनाया जाता है। अन्यथा, फ़ाइल अधिलेखित है।

  • 'wb+' - बाइनरी मोड में लिखने और पढ़ने का तरीका। w+ समान ही, लेकिन डेटा बाइनरी में है।

  • 'ab' - बाइनरी मोड में संलग्न। करने के लिए इसी तरह की a सिवाय इसके कि डेटा बाइनरी में है।

  • 'a+' - एपेंडिंग और रीडिंग मोड। w+ समान ही यह एक नई फ़ाइल बनाएगा यदि फ़ाइल मौजूद नहीं है। अन्यथा, फ़ाइल पॉइंटर फ़ाइल के अंत में है यदि यह मौजूद है।

  • 'ab+' - द्विआधारी में एपेंडिंग और रीडिंग मोड। डेटा को बाइनरी में छोड़कर a+ जैसा ही है।

     with open(filename, 'r') as f:
         f.read()
     with open(filename, 'w') as f:
         f.write(filedata)
     with open(filename, 'a') as f:
         f.write('\n' + newdata)
    
आर r + w w + एक +
पढ़ें
लिखना
फ़ाइल बनाता है
फ़ाइल मिटा देता है
प्रारंभिक स्थिति शुरू शुरू शुरू शुरू समाप्त समाप्त

पायथन 3 ने exclusive creation लिए एक नया मोड जोड़ा ताकि आप गलती से ट्रंकट या ओवरराइट न करें और मौजूदा फ़ाइल।

  • 'x' - अनन्य निर्माण के लिए खुला, अगर फ़ाइल पहले से मौजूद है तो FileExistsError
  • 'xb' - बाइनरी में विशेष सृजन लेखन मोड के लिए खुला है। डेटा को छोड़कर x जैसा ही बाइनरी में है।
  • 'x+' - पढ़ने और लिखने की विधा। w+ समान ही यह एक नई फ़ाइल बनाएगा यदि फ़ाइल मौजूद नहीं है। अन्यथा, FileExistsError
  • 'xb+' - लेखन और पढ़ने का तरीका। x+ समान सटीक लेकिन डेटा बाइनरी है
एक्स x +
पढ़ें
लिखना
फ़ाइल बनाता है
फ़ाइल मिटा देता है
प्रारंभिक स्थिति शुरू शुरू

एक और अधिक pythonic तरीके से अपनी फ़ाइल को खुले कोड लिखने की अनुमति दें:

अजगर 3.x 3.3
try:
    with open("fname", "r") as fout:
        # Work with your open file
except FileExistsError:
    # Your error handling goes here

पायथन 2 में आपने कुछ ऐसा किया होगा

पायथन 2.x 2.0
import os.path
if os.path.isfile(fname):
    with open("fname", "w") as fout:
        # Work with your open file
else:
    # Your error handling goes here

फ़ाइल लाइन-दर-पंक्ति पढ़ना

फ़ाइल लाइन-बाय-लाइन पर पुनरावृति का सबसे सरल तरीका:

with open('myfile.txt', 'r') as fp:
    for line in fp:
        print(line)

readline() लाइन-बाय-लाइन पुनरावृत्ति पर अधिक बारीक नियंत्रण के लिए अनुमति देता है। नीचे दिया गया उदाहरण ऊपर वाले के बराबर है:

with open('myfile.txt', 'r') as fp:
    while True:
        cur_line = fp.readline()
        # If the result is an empty string
        if cur_line == '':
            # We have reached the end of the file
            break
        print(cur_line)

लूप इटरेटर और रीडलाइन () के लिए एक साथ उपयोग करना बुरा व्यवहार माना जाता है।

अधिक सामान्यतः, readlines() विधि का उपयोग फ़ाइल की पंक्तियों के एक संग्रहणीय संग्रह को संग्रहीत करने के लिए किया जाता है:

with open("myfile.txt", "r") as fp:
    lines = fp.readlines()
for i in range(len(lines)):
    print("Line " + str(i) + ": " + line)

यह निम्नलिखित प्रिंट करेगा:

पंक्ति ०: नमस्ते

पंक्ति 1: दुनिया

किसी फ़ाइल की पूरी सामग्री प्राप्त करना

फ़ाइल i / o का पसंदीदा तरीका कीवर्ड के with उपयोग करना है। यह सुनिश्चित करेगा कि पढ़ने या लिखने के पूरा होने के बाद फ़ाइल हैंडल बंद हो जाए।

with open('myfile.txt') as in_file:
    content = in_file.read()

print(content)

या, मैन्युअल रूप से फ़ाइल को बंद करने को संभालने के लिए, आप छोड़ सकते हैं with और केवल फोन close अपने आप को:

in_file = open('myfile.txt', 'r')
content = in_file.read()
print(content)
in_file.close()

ध्यान रखें कि एक का उपयोग किए बिना with बयान, अगर आप गलती से फ़ाइल मामले में खुला एक अप्रत्याशित अपवाद तो जैसे उठता रखने हो सकता है:

in_file = open('myfile.txt', 'r')
raise Exception("oops")
in_file.close()  # This will never be called

एक फ़ाइल के लिए लेखन

with open('myfile.txt', 'w') as f:
    f.write("Line 1")
    f.write("Line 2")
    f.write("Line 3")
    f.write("Line 4")

यदि आप myfile.txt खोलते हैं, तो आप देखेंगे कि इसकी सामग्री हैं:

पंक्ति 1 लाईन 2 लीन 3 लीन 4

पायथन स्वचालित रूप से लाइन ब्रेक नहीं जोड़ता है, आपको मैन्युअल रूप से ऐसा करने की आवश्यकता है:

with open('myfile.txt', 'w') as f:
    f.write("Line 1\n")
    f.write("Line 2\n")
    f.write("Line 3\n")
    f.write("Line 4\n")

पंक्ति 1
लाइन 2
पंक्ति 3
पंक्ति 4

पाठ मोड (डिफ़ॉल्ट) में खोली गई फ़ाइलों को लिखते समय os.linesep को एक लाइन टर्मिनेटर के रूप में उपयोग न करें; इसके बजाय \n उपयोग करें।

यदि आप एन्कोडिंग निर्दिष्ट करना चाहते हैं, तो आप open फ़ंक्शन में encoding पैरामीटर जोड़ सकते हैं:

with open('my_file.txt', 'w', encoding='utf-8') as f:
    f.write('utf-8 text')

फ़ाइल पर लिखने के लिए प्रिंट स्टेटमेंट का उपयोग करना भी संभव है। पायथन 2 बनाम पायथन 3 में यांत्रिकी अलग हैं, लेकिन अवधारणा एक ही है कि आप उस आउटपुट को ले सकते हैं जो स्क्रीन पर गया होगा और इसके बजाय इसे एक फ़ाइल में भेजना होगा।

अजगर 3.x 3.0
with open('fred.txt', 'w') as outfile:
    s = "I'm Not Dead Yet!"
    print(s) # writes to stdout
    print(s, file = outfile) # writes to outfile

    #Note: it is possible to specify the file parameter AND write to the screen
    #by making sure file ends up with a None value either directly or via a variable
    myfile = None
    print(s, file = myfile) # writes to stdout
    print(s, file = None)   # writes to stdout

पायथन 2 में आपने कुछ ऐसा किया होगा

पायथन 2.x 2.0
outfile = open('fred.txt', 'w')
s = "I'm Not Dead Yet!"
print s   # writes to stdout
print >> outfile, s   # writes to outfile

लेखन फ़ंक्शन का उपयोग करने के विपरीत, प्रिंट फ़ंक्शन स्वचालित रूप से लाइन ब्रेक जोड़ता है।

एक फ़ाइल की सामग्री को एक अलग फ़ाइल में कॉपी करना

with open(input_file, 'r') as in_file, open(output_file, 'w') as out_file:
    for line in in_file:
        out_file.write(line)
  • shutil मॉड्यूल का उपयोग करना:
import shutil
shutil.copyfile(src, dst)

जांचें कि कोई फ़ाइल या पथ मौजूद है या नहीं

ईएएफपी कोडिंग शैली को रोजगार दें और इसे खोलने का try करें।

import errno

try:
    with open(path) as f:
        # File exists
except IOError as e:
    # Raise the exception if it is not ENOENT (No such file or directory)
    if e.errno != errno.ENOENT:
        raise
    # No such file or directory

यदि दूसरी प्रक्रिया चेक के बीच फ़ाइल को डिलीट कर देती है और इसका उपयोग किया जाता है, तो यह दौड़ की स्थिति से भी बचता है। यह दौड़ की स्थिति निम्नलिखित मामलों में हो सकती है:

  • os मॉड्यूल का उपयोग:

    import os
    os.path.isfile('/path/to/some/file.txt')
    
पायथन 3.x 3.4
  • pathlib का उपयोग करना:

    import pathlib
    path = pathlib.Path('/path/to/some/file.txt')
    if path.is_file():
        ...
    

यह जांचने के लिए कि कोई दिया गया मार्ग मौजूद है या नहीं, आप उपरोक्त ईएएफपी प्रक्रिया का पालन कर सकते हैं, या स्पष्ट रूप से पथ की जाँच कर सकते हैं:

import os
path = "/home/myFiles/directory1"

if os.path.exists(path):
    ## Do stuff

एक निर्देशिका पेड़ की प्रतिलिपि बनाएँ

import shutil
source='//192.168.1.2/Daily Reports'
destination='D:\\Reports\\Today'
shutil.copytree(source, destination)  

गंतव्य निर्देशिका पहले से मौजूद नहीं होनी चाहिए

Iterate फ़ाइलें (पुनरावर्ती)

उप निर्देशिकाओं सहित सभी फ़ाइलों को पुनरावृत्त करने के लिए, os.walk का उपयोग करें:

import os
for root, folders, files in os.walk(root_dir):
    for filename in files:
        print root, filename

root_dir हो सकता है "।" वर्तमान निर्देशिका, या किसी अन्य पथ से आरंभ करने के लिए।

अजगर 3.x 3.5

यदि आप फ़ाइल के बारे में जानकारी प्राप्त करना चाहते हैं, तो आप अधिक कुशल विधि का उपयोग कर सकते हैं। os.scandir जैसे:

for entry in os.scandir(path):
   if not entry.name.startswith('.') and entry.is_file():
       print(entry.name)

कई लाइनों के बीच एक फ़ाइल पढ़ें

तो मान लें कि आप किसी फ़ाइल की कुछ विशिष्ट लाइनों के बीच ही चलना चाहते हैं

आप itertools लिए itertools उपयोग कर सकते हैं

import itertools

with open('myfile.txt', 'r') as f:
    for line in itertools.islice(f, 12, 30):
        # do something here

यह पंक्तियों के माध्यम से 13 से 20 तक पढ़ेगा क्योंकि अजगर अनुक्रमण 0. से शुरू होता है। इसलिए पंक्ति संख्या 1 को 0 के रूप में अनुक्रमित किया जाता है

जैसा कि यहां next() कीवर्ड का उपयोग करके कुछ अतिरिक्त लाइनें भी पढ़ सकते हैं।

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

रैंडम फ़ाइल एक्सेस का उपयोग mmap

mmap मॉड्यूल का उपयोग करके उपयोगकर्ता को फ़ाइल में मेमोरी में फ़ाइल को मैप करके बेतरतीब ढंग से एक्सेस करने की अनुमति मिलती है। यह सामान्य फ़ाइल संचालन का उपयोग करने का एक विकल्प है।

import mmap

with open('filename.ext', 'r') as fd:
    # 0: map the whole file
    mm = mmap.mmap(fd.fileno(), 0)

    # print characters at indices 5 through 10
    print mm[5:10]

    # print the line starting from mm's current position
    print mm.readline()

    # write a character to the 5th index
    mm[5] = 'a'

    # return mm's position to the beginning of the file
    mm.seek(0)

    # close the mmap object
    mm.close()

एक फ़ाइल में पाठ की जगह

import fileinput

replacements = {'Search1': 'Replace1',
                'Search2': 'Replace2'}

for line in fileinput.input('filename.txt', inplace=True):
    for search_for in replacements:
        replace_with = replacements[search_for]
        line = line.replace(search_for, replace_with)
    print(line, end='')

यदि कोई फ़ाइल खाली है, तो जाँच कर रहा है

>>> import os
>>> os.stat(path_to_file).st_size == 0

या

>>> import os    
>>> os.path.getsize(path_to_file) > 0

हालाँकि, यदि फ़ाइल मौजूद नहीं है, तो दोनों अपवाद छोड़ देंगे। ऐसी त्रुटि को पकड़ने से बचने के लिए, यह करें:

import os
def is_empty_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0

जो bool मान लौटाएगा।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow