As with any other programming language, Python supports reading and writing to files, this can be useful in many scenarios, for example as a way to store data for later use or to save the results of a calculation. Sometimes this is helpful to create reports or files that can be handled by other programs.

The most basic way to read a file is to use the open() function.

1
2
3
4
5
6
7
8
# Read a file and output its contents

file = open("test.txt", "r")

data = file.read()
print(data)

file.close()

Result:

Non enim illum accusamus non. Eligendi expedita ipsa. Et tempora quod omnis velit aut cupiditate inventore ut inventore. Doloribus similique adipisci animi ratione qui. Omnis quod odit. Sit aliquam molestiae dicta eaque nesciunt. Ad quaerat minus delectus fuga ut. Et quo ducimus aliquid distinctio eaque similique rerum est recusandae. Libero voluptas quia corporis commodi cupiditate reiciendis enim. Natus eum eius. Dolor laudantium sint quia quasi aut repellendus quas quidem non.

If we analyze the previous code, we can see that the file is opened in the r mode, which means that the file is opened for reading, but also that after using the file, we need to close it. As with many other ways of doing things in Python, there is an easier way to do this.

1
2
3
4
5
# Read a file and output its contents using the `with` statement

with open("test.txt", "r") as file:
    data = file.read()
    print(data)

Result:

Non enim illum accusamus non. Eligendi expedita ipsa. Et tempora quod omnis velit aut cupiditate inventore ut inventore. Doloribus similique adipisci animi ratione qui. Omnis quod odit. Sit aliquam molestiae dicta eaque nesciunt. Ad quaerat minus delectus fuga ut. Et quo ducimus aliquid distinctio eaque similique rerum est recusandae. Libero voluptas quia corporis commodi cupiditate reiciendis enim. Natus eum eius. Dolor laudantium sint quia quasi aut repellendus quas quidem non.

And that’s it, we can now read the contents of the file and print it to the screen without worrying about closing the file because the with statement does this for us. But aside from reading the whole contents of a file, we can also read the contents of a specific line or a specific part of a line or read it entirely line by line.

1
2
3
4
5
6
7
# Read a file line by line.
from time import sleep

with open("test.txt", "r") as file:
    for idx, line in enumerate(file):
        print(f"Line {idx}: {line}")
        sleep(0.5)

Result:

Line 0: Non enim illum accusamus non. Eligendi expedita ipsa. Et tempora quod omnis velit aut cupiditate inventore ut inventore. Line 1: Doloribus similique adipisci animi ratione qui. Line 2: Omnis quod odit. Sit aliquam molestiae dicta eaque nesciunt. Ad quaerat minus delectus fuga ut. Line 3: Et quo ducimus aliquid distinctio eaque similique rerum est recusandae. Line 4: Libero voluptas quia corporis commodi cupiditate reiciendis enim. Natus eum eius. Line 5: Dolor laudantium sint quia quasi aut repellendus quas quidem non.

But reading is not everything we can do with files, we can also write to files.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Define a dictionary and write it to a file in a pretty format

car_models = {
    "Ford": "Fiesta",
    "Volkswagen": "Golf",
    "Toyota": "Corolla",
}

with open("car_models.txt", "w") as file:
    for make, model in car_models.items():
        file.write(f"{make} - {model}\n")

Catching Errors

Sometimes when you are working with files, bad things happen. The file is locked because some other process is using it or you have some kind of permission error. When this happens, an IOError will probably occur.

We can do this using the try and except statements that we learned about in the previous section.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Open a file with try and except to handle errors.

try:
    with open("test.txt", "r") as file:
        data = file.read()
        print(data)
except FileNotFoundError:
    print("File not found")

try:
    file = open("test.txt", "r")
    for line in file:
        print(line)
    file.close()
except IOError:
    print("Could not read file")


# Write to a file with try and except to handle errors.

try:
    with open("/test2.txt", "w") as file:
        file.write("This is a test")
except PermissionError:
    print("No permissions to file")


try:
    file = open("/test2.txt", "w")
    file.write("This is a test")
    file.close()
except IOError:
    print("Could not write to file")

Result:

Non enim illum accusamus non. Eligendi expedita ipsa. Et tempora quod omnis velit aut cupiditate inventore ut inventore. Doloribus similique adipisci animi ratione qui. Omnis quod odit. Sit aliquam molestiae dicta eaque nesciunt. Ad quaerat minus delectus fuga ut. Et quo ducimus aliquid distinctio eaque similique rerum est recusandae. Libero voluptas quia corporis commodi cupiditate reiciendis enim. Natus eum eius. Dolor laudantium sint quia quasi aut repellendus quas quidem non.

Non enim illum accusamus non. Eligendi expedita ipsa. Et tempora quod omnis velit aut cupiditate inventore ut inventore.

Doloribus similique adipisci animi ratione qui.

Omnis quod odit. Sit aliquam molestiae dicta eaque nesciunt. Ad quaerat minus delectus fuga ut.

Et quo ducimus aliquid distinctio eaque similique rerum est recusandae.

Libero voluptas quia corporis commodi cupiditate reiciendis enim. Natus eum eius.

Dolor laudantium sint quia quasi aut repellendus quas quidem non.

No permissions to file Could not write to file