File Handling
Instruction
Python is notable for its particularly easy-to-use syntax when working with files. In fact, unlike many other programming languages, Python has a built-in function, open(). open() is used specifically for opening local files. There’s no need to import a file-handling library!
Opening a File
To open a file, you simply use the open() function:
# Open "some-file.txt" for reading
file = open("some-file.txt", "r")
In most cases, you’ll provide open() with two arguments:
- Filename: An absolute or relative pathname for the file you want to open.
- Mode (optional): Specifies how you want to open the file. The following modes apply to text files:
open() returns a file object that provides methods for reading to, writing from, and closing the specified file.
Closing a File
As you might expect, you should close a file once you’re done working with it. You do so using the file object’s close() method:
# We're done with "some-file.txt"; close it
file.close()
A Better Way to Open Files
It’s too easy to forget to close a file you’ve opened. Python addresses this by using the with statement. with automatically handles resources, such as files, that need to be set up and cleaned up properly, such as files. Instead of doing this:
# The old way
file = open(r"some-file.txt", "r")
# Perform file operations
file.close()
The with statement creates the file object and lets you define a code block:
# The newer, Pythonic way
with open(r"some-file.txt", "r") as file:
# Perform file operations
There’s no longer any need to call the file object’s close() method. with performs all the necessary setup before entering the code block and any necessary cleanup when the block is exited.
Reading From a File
If you’ve opened a file in a mode that allows for reading from it, you can use the following file object methods to read its contents:
You can also use a for loop to iterate through the lines in a file:
# Assume that `file` is a file object
# opened in a “read” mode
for line in file:
print(line)
A couple of things to note about the approaches above:
-
read()andreadlines()are more convenient. - Using
readline()in a loop orfor line in file:is more memory-efficient.
Writing to a File
If you’ve opened a file in a mode that allows for writing to it, you can use the following file object methods:
You can also use the print() function with the optional file= parameter to write a single line to a file:
# Assume that `file` is a file object
# opened in a “write” or “append” mode
print("Here's another line.", file=file)
Unlike write() and writelines(), print() automatically adds a newline character to the end of its output.
Exception Handling
Working with files and other outside data opens the possibility of issues beyond your application’s control, from trying to access a file that was moved, deleted or had its access permissions changed to I/O errors. If your application works with external information, it must be prepared to handle exceptions.
Python’s Exception Handling Keywords: try, except, else, and finally
Python’s exception handling takes a similar approach. It uses similar keywords to those in other popular programming languages — just with Python’s syntax, and an extra keyword for performing additional actions when an exception didn’t occur:
File-Related Exceptions
Here are the exceptions that you’re most likely to encounter when reading from or writing to files:
A File Exception-Handling Example
Here’s a quick exception handling example that shows all the keywords in action. Assume that the try block contains code that reads a specific file:
try:
with open(r"programming-languages.txt", "r") as file:
print(file.read())
except FileNotFoundError:
print("Couldn't find the file.")
except PermissionError:
print("You don't have permission to access the file.")
except OSError: # OSError includes I/O errors
print("I/O error. Contact the developer.")
except Exception as e:
print("An unexpected error occurred!")
print(f"Error code: {e.errno}")
print(f"Error message: {e.strerror}")
print(f"Filename: {e.filename}")
print(f"String representation: {str(e)}")
print(f"Detailed representation: {repr(e)}")
print("Contact the developer.")
else:
print("Congratulations! No errors!")
finally:
print("All done.")
If something in the try block causes an exception, Python starts working its way down the except blocks in order. Because of this, most except blocks are arranged in order, from most likely and specific (which is why the FileNotFoundError case is listed first) to most unlikely and general (which is why the catch-all Exception) case is listed last.
Notice that the final except block “captures” the Exception instance. The block’s code can access the Exception to display more information. You can do this with any Exception subclass.