Python contextlib (Working with files - open, read, write, copy, binary)

Working with files using context manager:


# Working with context manager directly

with open('data.txt', 'w') as f:

    f.write('Test')

    # no need to write f.close()

    # because it will be handled by python automatically



print(f.closed) # True (because file was closed automatically)





# Working with context manager using a class

class Open_File():



    def __init__(self, filename, mode):

        self.filename = filename

        self.mode = mode



    def __enter__(self):

        self.file = open(self.filename, self.mode)

        return self.file



    def __exit__(self, exc_type, exc_val, traceback):

        self.file.close()



with Open_File('data_2.txt', 'w') as f2:

    f2.write('Test 2')



print(f2.closed) # True (because file was closed by __exit__)





# Working with context manager using a function

from contextlib import contextmanager



@contextmanager

def open_file(file, mode):

    try:

        f = open(file, mode)

        yield f

    finally:

        f.close()





with open_file('data_3.txt', 'w') as f3:

    f3.write('Test 3.')



print(f3.closed) # True

Example to get the list of files in the directory with context manager:


import os

from contextlib import contextmanager



@contextmanager

def dir_filelist(destination):

    try:

        cwd = os.getcwd()

        os.chdir(destination)

        yield

    finally:

        os.chdir(cwd)



with dir_filelist('folder_1'):

    print(os.listdir()) # ['data.txt', 'data_2.txt', 'data_3.txt']





with dir_filelist('folder_2/subfolder'):

    print(os.listdir()) # ['data_q2.txt', 'data_q3.txt', 'data_qq.txt']

Working with files (open, read, write, copy, binary)


# 'r' - read mode

# 'w' - write mode (override mode) (creates new file, if it doesn't exist)

# 'r+' - read and write mode

# 'a' - append mode (add mode) (creates new file, if it doesn't exist)

# 'b' - binary mode



# open file for reading with context manager

with open('data.txt', 'r') as f:

    # print(dir(f)) # prints all the available attributes and methods for the object

    print(f.name) # 'data.txt'

    print(f.mode) # r

    print(f.closed) # False

    print(f.readable()) # True

    print(f.writable()) # False

    # f_contents = f.read() # read all lines from file

    # print(f_contents) # Test /n Test 2 /n Test 3

    # fl = f.readlines() # keep all lines if you need to reuse them

    for line in f: # iterator will be emptied after the first run

        print(line) # Test; Test 2; Test 3



# no need for f.close()

# file will be closed automatically with context manager

print(f.closed) # True





# open file for writing with context manager

with open('data-write.txt', 'w') as f:

    f.write('Test 1')

    f.write('Test 2')



# copy text file content into another file with context manager

with open('data.txt', 'r') as rf:

    with open('data-copy.txt', 'w') as wf:

        for line in rf:

            wf.write(line)



# copy binary file content into another file with context manager

with open('video.mp4', 'rb') as rf2:

    with open('video-copy.mp4', 'wb') as wf2:

        for line in rf2:

            wf2.write(line)



# copy binary file chunk by chunk into another file with context manager

with open('video2.mp4', 'rb') as rf3:

    with open('video2-copy.mp4', 'wb') as wf3:

        chunk_size = 4096

        rf_chunk = rf3.read(chunk_size)

        while len(rf_chunk) > 0:

            wf3.write(rf_chunk)

            rf_chunk = rf3.read(chunk_size)

Leave a Comment