fd.seek()
methodos.stat()
method10.Bonus: Handling Image Files in Python
For file handling there are four important operations that can be handled by Python on files:
There are other file operations as well e.g., deleting a file, renaming a file, appending data to file, copying a file, changing properties of file. However, CRUD operations are basic file handling operations.
Files in Python can be opened with a built-in open()
function. Ideally, it takes two string arguments:
filepath
including the file name and the extension we want to open (passed as a string)mode
in which we want to open the file (passed as a string), default value is 'rt'
open(file, mode='rt')
Where,
file
is the only required argument, including the file name and the extension we want to open (passed as a string)mode
is for the file access modes (passed as a string)help(open)
FILE ACCESS MODES
Read Only (‘r’)
: It opens the text file for reading. If the file does not exist, raises I/O error.Read and Write (‘r+’)
: It opens the file for reading and writing. Raises I/O error if the file does not exists.Write Only (‘w’)
: It opens the file for writing only. For existing file, data is truncated. Creates the file if the file does not exists.Write and Read (‘w+’)
: It opens the file for reading and writing. For existing file, data is truncated. Creates the file if the file does not exists.Append Only (‘a’)
: It opens the file for writing, appending to the end off the file if it exists. The file is created if it does not exist.Append and Read (‘a+’)
: It opens the file for reading and writing. The file is created if it does not exist. The data being written will be inserted at the end, after the existing data.Exclusive creation (‘x’)
: It Opens a file for exclusive creation. If the file already exists, the operation fails.Along with above file access modes, you can also specify how file should be handled as text or binary
Text file (‘t’)
: Opens a file in text modeBinary file (‘b’)
: Opens a file in binary mode# Example 1: Open a text named file f1.txt, present in the current working directory in read write mode
# On Mac OS the absolute path may look like: /Users/arif/Documents/.../f1.txt
# In Microsoft OSs, the absolute path may look like: "C:\\Users\\Kakamanna\\f1.txt"
fd = open("f1.txt", "rt+")
fd
# Example 2: Open a binary file named image.png, present in the current working directory in read write mode
fd = open("image.png", "rb+")
fd
fd.read(size=-1)
fd.readline(size=-1)
fd.readlines(sizehint=-1)
fd.read(size=-1)
method¶fd.read()
method reads and returns size
characters from the file (if size is positive)size
is negative or omitted, read until EOF# Example:
fd = open("f1.txt","r")
fd = open("f1.txt")
fd = open("f1.txt", "rt") # are all equivalent
rv = fd.read(5)
print(rv, type(rv))
# Example: Reading the complete file till EOF character
fd=open("f1.txt")
fd.read()
# Example: Try to read again, and notice what will happen?
fd.read()
- As you can see we got an empty string.
- The reason is
fd.read()
always reads from the current file offset, which in this situation has reached the end of file, therefore it returns an empty string
# close the file
fd.close()
# Let us open and read the file again
fd = open("f1.txt","r")
print(fd.read())
fd.close()
fd.readline(size=-1)
method¶fd.readline()
method reads and returns one line at a timesize
is passed then reads and returns size characters of a line# Example: If you want to read a file line by line use readline() method
fd = open("f1.txt","r")
print(fd.readline())
print(fd.readline())
print(fd.readline())
print(fd.readline())
print(fd.readline())
# close the file
fd.close()
# Example: If you want to read a file line by line use readline() method
fd = open("f1.txt","r")
#print(fd.readline())
print(fd.readline(5))
# close the file
fd.close()
So
fd.read()
method focuses on reading a file character by character, while thefd.readline()
method focuses on reading a file line by line.
fd.readlines(sizehint=-1)
method¶fd.readlines()
method reads until end of file and returns a list object containing the lines.fd = open("f1.txt","r")
mylist = fd.readlines()
print(mylist)
print(type(mylist))
# close the file
fd.close()
sizehint
passed, instead of reading up to EOF, whole lines totalling approximately sizehint
bytes are read. (possibly after rounding up to an internal buffer size)fd = open("f1.txt","r")
rd = fd.readlines(17)
print(rd)
# close the file
fd.close()
fd.write()
method¶fd.write(text)
method is used to write a string to file.fd.write(text)
returns the number of characters written (which is always equal to the length of the string) It overwrites the existing data. If the file doesn't exist, it will create the file.Append Only (‘a’)
: It opens the file for writing, appending to the end off the file if it exists. The file is created if it does not exist.Append and Read (‘a+’)
: It opens the file for reading and writing. The file is created if it does not exist. The data being written will be inserted at the end, after the existing data.Example 1: Let us create a new file in the present working directory. Let us use mode='w'
(Write Only
). It will create the file as it do not exist. If the file with the name exist its data is truncated.
fd1 = open('out.txt','w')
rv = fd1.write('Python is Awesome!')
print("Number of bytes written in the file: ", rv)
fd1.close()
# Let us open the file in read mode and read its contents
fd1 = open('out.txt')
print(fd1.read())
fd1.close()
Example 2: Let us again open out.txt
file in the present working directory in mode=w+
(Write and Read). Since the file already exist, the file is opened and its data is truncated. If the file with the neame does not exist, a new file is created.
fd1 = open('out.txt','w+') # Due to w+ all the data is truncated
print("Existing data in the file is: ", fd1.read())
# Since the file is opened in read-write mode so we can write in the file
fd1.write('Learning Python is Fun!')
# Since the file is opened in read-write mode so we can read from the file
print("Data in out.txt after writing: ", fd1.read())
#This is because the file offset is at the end of the file
fd1.seek(0)
print("Data read again after seek: ", fd1.read())
fd1.close()
Example 3: Let us now append some text in the file out.txt
by opening it in append mode mode=a
. It opens the file for writing, appending to the end of the file if it exists. The file is created if it does not exist.
# creating a list
fruits = ["\nApple","\nBanana","\nOranges"]
# open a file in append mode
fd =open("out.txt",mode="a")
#Copying the list content in file
for fruit in fruits:
fd.write(fruit)
fd.close()
# open a file in read mode again
fd =open("out.txt")
#reading the data from file
for line in fd:
print(line)
# close the file
fd.close()
fd.close()
method¶Closing a file will free up the resources that were tied with the file. Python has a garbage collector to clean up unreferenced objects but we must not rely on it to close the file.
# open a file
f = open("f1.txt", "r")
# perform some file operations
#close the file
f.close()
fd.close()
in try...finally
Block¶In such scenarios,
try-except-finally
blocks come to the rescue. We can keep thefd.close()
method in the finally block, so that even if the program execution stops due to an exception, the file will get closed anyway.
# Put the entire code in try block
try:
fd = open("f1.txt", "r")
# perform file operations
finally:
fd.close()
with
Keyword while opening a File¶with
keyword.with
statement exits.# open the file in read mode using with statement
with open("f1.txt", "r") as fd:
# perform file operations
print(fd.read())
Let us confirm if the file opened in the above code cell is closed or not
fd.read()
fd.seek()
method¶The fd.seek()
method is used to change the position of the File Handle or current file offset to a given specific position, from where the data has to be read or written in the file. The method returns the new absolute position.
seek(offset, whence)
Where,
offset
means the number of positions to move forward/backward. It is interpreted relative to the position indicated by whencewhence
can take following values:Note:
# Example:
fd = open("f1.txt","r")
# check the position of file offset
rv = fd.seek(0, 1) # fd.seek(0, 1) is equivalent to fd.tell()
print("Cursor is pointing at the location: ", rv)
# Let us read five characters and check the position of file offset
fd.read(5)
rv = fd.seek(0, 1)
print("Cursor is pointing at the location: ", rv)
# Let us read remaining portion of file and check the position of file offset
fd.read()
rv = fd.seek(0, 1)
print("Cursor is pointing at the location: ", rv)
fd.close()
# fd.seek(0, 1) is equivalent to fd.tell()
# Example: Let us do some more practice with the seek() function
# open a file in append mode
fd = open("f1.txt","a")
print("Cursor is pointing at the location: ", fd.seek(0, 1))
# set the cursor to beginning
cur = fd.seek(0, 0) # equivalent to fd.seek(0, 0)
print("Cursor is pointing at the location: ", cur)
# set the cursor to 100 position from beginning
cur = fd.seek(100) # equivalent to fd.seek(100, 0)
print("Cursor is pointing at the location: ", cur)
# let us move the cursor 50 bytes back from current position
cur = fd.seek(50, 0)
print("Cursor is pointing at the location: ", cur)
#close the file
fd.close()
Using a while
loop
fd = open("hello.txt","r")
while True:
line = fd.readline()
if not line:
break
print(line)
fd.close()
Using a for
loop
fd = open("hello.txt","r")
for line in fd: #File handle can be used as iterator in the for loop
print(line)
fd.close()
A better way to iterate a file line by line using a for
loop
for line in open("hello.txt", 'r'):
print(line)
#How can we close the file handle, as we dont have one
The best way to iterate a file line by line using a for
loop
with open("hello.txt", 'r') as fd:
for line in fd:
print(line)
str.split()
method¶# Example:
totalwords = 0
with open("f1.txt", "r") as fd:
for line in fd:
listoftokens = line.split(' ')
print(line, len(listoftokens))
totalwords = totalwords + len(listoftokens)
print("\nTotal words in this file are: ", totalwords)
os.stat()
method¶os.stat(path)
method is used to get attributes of a file likeimport os
status = os.stat("out.txt")
status
# You can extract the information individually
import os
status = os.stat("out.txt")
print("File size: ", status.st_size)
# extract the file type and file mode bits (permissions)
print("File type and permissions: ", status.st_mode)
# user identifier of the file owner
print("File Owner: ", status.st_uid)
# recent access time in seconds
print("Last access time: ", status.st_atime)
# recent modification time in seconds
print("Last modification time: ", status.st_mtime)
# recent metadata change on Unix and creation time on Windows
print("Last status change time: ", status.st_ctime)
import os
!ls
name = input("Enter name of the file/directory: ")
if os.path.isfile(name):
print("It is a file")
elif os.path.isdir(name):
print("It is a directory")
else:
print("Unknown file type or file do not exist")
import csv
with open('file1.csv', 'r') as fd:
obj = csv.reader(fd)
obj
import csv
with open('file1.csv', 'r') as fd:
obj = csv.reader(fd)
for line in obj:
print(line)
import csv
with open('file1.csv', 'r') as fd:
obj = csv.reader(fd)
line = next(obj)
print(line)
line = next(obj)
print(line)
fd = open("speech.jpg", "rb")
print(fd.read())
fd.close()
from PIL import Image
img = Image.open("speech.jpg")
img.format
img.size
img.mode
img
import numpy as np
img_array = np.array(img)
img_array.shape
img_array
img_copy = img.copy()
img_copy
img_cropped = img.crop((250,0,500,300))
img_cropped
img_cropped.save('smallimg.jpg')
out = img_cropped.transpose(Image.ROTATE_90)
out
out.save('corpped_speech.jpg')
img2 = Image.open("corpped_speech.jpg")
img2
https://www.youtube.com/watch?v=K1xO8weArNA&t=5m56s
While accessing Internet, if you get
SSL: CERTIFICATE_VERIFY_FAILED
error, set, the_create_default_https_context
attribute ofssl
to_create_unverified_context
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
Get the raw data url of the file ('hellogist.txt') to be downloaded from your github gist. Pass that url to
urlretrieve()
function to download file to disk
urllib.request.urlretrieve(url, filename=None)
Example1: Download, Open and Read hellogist.txt
from course Gist
import urllib
myurl = 'https://gist.githubusercontent.com/arifpucit/6e2d95002460db296506ec6f0cfb7008/raw/9dcad33321c01194dffe3586fc80c5a966a9494f/hellogist.txt'
urllib.request.urlretrieve(myurl, 'hellogist.txt')
Let us now open and read the file
fd = open("hellogist.txt","r")
mylist = fd.readlines()
print(mylist)
fd.close()
with open("hellogist.txt", 'r') as fd:
for line in fd:
print(line)
Example2: Download, Open and Read family.csv
from course Gist
import urllib
myurl = 'https://gist.githubusercontent.com/arifpucit/6e2d95002460db296506ec6f0cfb7008/raw/9dcad33321c01194dffe3586fc80c5a966a9494f/family.csv'
urllib.request.urlretrieve(myurl, 'family.csv')
fd = open("family.csv","r")
mylist = fd.readlines()
print(mylist)
fd.close()
Example3: Download, Open and Read myself.txt
from course Gist
import urllib
myurl = 'https://gist.githubusercontent.com/arifpucit/6e2d95002460db296506ec6f0cfb7008/raw/efee0050a52048215c8772063ba4ef47ecd2b514/myself.txt'
urllib.request.urlretrieve(myurl, 'myself.txt')
fd = open("myself.txt","r")
mylist = fd.readlines()
print(mylist)
fd.close()
with open("myself.txt", 'r') as fd:
for line in fd:
print(line)
def display(fname):
fd = open(fname, "r")
for line in fd:
print(line, end = '')
fd.close()
display('longfile.txt')
def display(fname):
fd = open(fname, "r")
mylist = fd.readlines()
for line in reversed(mylist):
print(line.rstrip())
fd.close()
display('longfile.txt')
def display(fname, count):
fd = open(fname, "r")
a = 0
mylist = fd.readlines()
fd.close()
for line in reversed(mylist):
print(line.rstrip())# print(line, end = '')
a = a + 1
if a == count:
break
display('longfile.txt', 5)
def line_count(fname):
fd = open(fname, "r")
mylist = fd.readlines()
fd.close()
return len(mylist)
line_count('longfile.txt')
def word_count(fname):
fd = open(fname, "r")
mystring = fd.read()
fd.close()
mystring = mystring.replace('\n', ' ')
wordcount = len(mystring.split(' '))
return wordcount
word_count('f1.txt')
def read_lines(fname):
mylist[]
fd = open(fname)
data = f.readlines()
for myline in data:
myline = myline.replace('\n', ' ')
mylist.add(myline)
print(mylist)
file_read('longfile.txt')
!cat f1.txt
def size_n_words(fname, n):
fd = open(fname, 'r')
mystring = fd.read()
fd.close()
mystring = mystring.replace('\n', ' ') #remove new line char if part of word
mystring = mystring.replace('.', '') #remove period char if part of word
mystring = mystring.replace(',', '') #remove comma char if part of word
mylist = mystring.split(' ') # now you have list of words
result_list = [word for word in mylist if len(word) == n]
return result_list
size_n_words('f1.txt', 2)
lengths
def uld_count(fname):
fd = open(fname,"r")
data=fd.read()
fd.close()
lcase = 100
ucase = lcase = digits = 0
#lcase=0
#digits=0
for ch in data:
if ch.islower():
lcase+=1
if ch.isupper():
ucase+=1
if ch.isdigit():
digits+=1
return ucase, lcase, digits
#print("Total Number of Upper Case letters are:",cnt_ucase)
# print("Total Number of Lower Case letters are:",cnt_lcase)
# print("Total Number of digits are:",cnt_digits)
u, l, d = uld_count('longfile.txt')
print("Upper Case:", u)
print("Lower Case:", l)
print("Digits count:", d)
fd = open('longfile.txt', "r")
for line in fd:
print(line)
!cat f1.txt
def search_word(fname):
ctr = 0
word_search = input("Enter the words to search:")
fd = open(fname, "r")
for line in fd:
words = line.split()
for word in words:
if (word == word_search):
ctr += 1
fd.close()
return ctr
rv = search_word('f1.txt')
print("Word found ", rv, " times in the file")
def mycopy(src, dest):
with open(src, "r") as fd1:
data = fd1.read()
with open(dest, "w") as fd2:
fd2.write(data)
mycopy('longfile.txt', 'temp.txt')
!cat temp.txt
def mymerge(file1, file2):
with open(file1, "r") as fd1:
data1 = fd1.read()
with open(file2, "r") as fd2:
data2 = fd2.read()
with open('merge.txt', "w") as fd3:
fd3.write(data1)
fd3.write(data2)
mymerge('hello.txt', 'f1.txt')
!cat merge.txt
def program3():
with open("hello.txt","r") as f1:
data=f1.read()
with open("f1.txt","r") as f2:
data1=f2.read()
with open("merge.txt","w") as f3:
f3.write(data)
f3.write(data1)
program3()
!cat hello.txt
!cat f1.txt
!cat merge.txt
fd = open("hellogist.txt","r")
print(fd.encoding)
print(fd.name)
print(fd.closed)
print(fd.mode)
print(fd.readable())
print(fd.writable())
print(fd.fileno())
print(fd.isatty())
print(fd.next())
with open('numbers.bin', 'wb') as fd:
numbers = [1,2,3,4]
fd.write(bytes(numbers))
with open('numbers.bin', 'rb') as fd:
data = fd.read()
print(data)
with open('string.bin', 'wb') as fd:
mystring = "Python123"
fd.write(mystring.encode('utf8'))
with open('string.bin', 'rb') as fd:
data = fd.read()
print(data)
import pickle
with open('temp.bin', 'wb') as fd:
pickle.dump(['Arif', 52, 2.3], fd)
pickle.dump(['Rauf', 53, 4.5], fd)
with open('temp.bin', 'rb') as fd:
data = pickle.load(fd)
print(data)
data = pickle.load(fd)
print(data)
#Standard code to write data to a binary file
import pickle
with open('students.bin', 'wb') as fd:
while True:
op = int(input("Enter 1 to add data and 0 to quit..."))
if (op == 1):
name = input("Enter name:")
rollno = input("Enter rollno:")
marks = float(input("Enter marks:"))
data = [name, rollno, marks]
pickle.dump(data, fd)
elif (op == 0):
break
# Standard code to read entire binary file
import pickle
with open('students.bin', 'rb') as fd:
while True:
try:
data = pickle.load(fd)
print(data)
except EOFError:
break
['arif', '1', 22.0] ['rauf', '2', 33.0] ['hadeed', '3', 72.3] ['mujahid', '4', 88.0]
!cp students.bin backup.bin
!cp backup.bin students.bin
# Reading specific column or row
with open('students.bin', 'rb+') as fd:
while True:
try:
posn = fd.tell()
record = pickle.load(fd)
if(record[0] == 'hadeed'):
record[2] = 72.3
fd.seek(posn,0)
pickle.dump(record, fd)
except EOFError:
break