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)