Files

By Martin McBride, 2018-08-07
Tags: file io file object open close with statement
Categories: python language beginning python


Introduction

In this lesson we will look at how to use files in Python:

  • Using files
  • Reading data
  • Writing data
  • Using with statements

Using files

There are 3 stages to reading or writing a file in Python:

Opening the file

You open a file by calling the open function. When you open a file you specify:

  • the path of the file, that is the name and the folder of the file.
  • whether you want to read the file, create a new file and write to it.

The open function checks whether the file exists and whether you are allowed to access the file (for example, you might not be allowed to access a file if it is already open in another program).

If all goes well, the open function returns a file object which you can use to access the file.

Reading and writing data

Python provides various function to read and write data to a file. These functions make use of the file object to access the file.

Closing the file

When you have finished with a file, it is very important to close it. This tells the operating system that you are not using it any more. We will see how to use with-statements to ensure the file is always closed at the end.

Reading data

Here is the code to read from a text file, and print out the contents:

f = open('myfile.txt', 'r')
s = f.read()
print(s)
f.close()

Code for reading a file

The first line opens the file. This takes two parameters, the name of the file, and the second parameter is the mode.

The mode can take various values, but the simplest are r, which opens an existing text file for reading, and w which creates a new text file for writing.

The code returns a file object which we store in variable f:

f = open('myfile.txt', 'r')

Now we can read from the file. The read function reads the entire file into one string, which we will store in variable s:

s = f.read()

Here we print the string in s (ie the contents of the file):

print(s)

Finally (and importantly) we close the file:

f.close()

If you want to try this, you should first create a text file called myfile.txt, and add a few lines of text to it. Store it in the same folder as your Python files.

Reading lines from a file

If you have a long text file, you might not want to read the whole file in one go - it could take too long, and use up too much memory.

Here is an alternative:

f = open('myfile.txt', 'r')
s = f.readline()
print(s)
f.close()

readline just reads a single line from a file. To read the entire file, you must call readline multiple times, for example in a loop.

readline returns a line of text, with a newline character (\n) at the end. If there is an empty line in the file, readline will return a string containing just one character, the \n.

When the end of the file is reached, readline will return an empty string.

Looping over the lines in a file

You could set up a loop using readline, but in fact there is an easier way:

f = open('myfile.txt', 'r')
for s in f:
    print(s)
f.close()

We can use the file object as an iterator, in a for-loop. The loop will execute once for each line in the file, and stop when it reaches the end of the file. Each time through the loop, the loop variable s will contain the next line from the file.

Writing data

Here is the code to write data to a file:

f = open('newfile.txt', 'w')
s = f.write('Line1\n')
s = f.write('Line2\n')
s = f.write('Line3\n')
f.close()

Code to write a file

To write a file, we use the open function as before, but for the mode (the second parameter) we use w. The open function will create a new file for writing. If the file already exists, it is truncated (any data already in the file is removed).

f = open('newfile.txt', 'w')

To write data, we use the write function. It is important to remember to add a new line (\n) character after each line.

s = f.write('Line1\n')

We close the file as before:

f.close()

The write function

There are several different functions for reading data from a file, but only one write function. That is because we can write as much, or as little, as we want with each write call.

We can write line by line:

s = f.write('Line1\n')
s = f.write('Line2\n')
s = f.write('Line3\n')

Or we can write the whole file at once:

s = f.write('Line1\nLine2\nLine3\n')

We can even write parts of a line:

s = f.write('Line1\nLi')
s = f.write('ne2\nLine3\n')

However we split the data, it will all get joined together again when we write the file. The important thing is that we must put a \n at the end of each line.

Using with statements

In the examples so far we have always added a line to close the file:

f = open('newfile.txt', 'w')
s = f.write('Line1\n')
s = f.write('Line2\n')
s = f.write('Line3\n')
f.close()

Unfortunately, file functions can fail for various reasons, such as a read or write error, or the disk is full. In those cases, the program might throw an error before it closes the file. The program might exit leaving the file open.

Closing files is very important because:

  • If you keep the file open, other programs might be blocked from using that file.
  • The operating system might have a limit on how files can be open at any one time. If your program keeps lots of files open for no good reason, it might stop other programs from working.
  • When you call the write function, the system might not write the data to file straight away. It might buffer the data before writing it out, waiting until there is a larger amount of data that can be written out in one go. When you close the file, all buffered data is written to the file before it is closed.

We can avoid these problems using a with-statement.

with open('newfile.txt', 'w') as f:
    s = f.write('Line1\n')
    s = f.write('Line2\n')
    s = f.write('Line3\n')

The with statement acts as a sort of guardian of the file object created by the open function. The as part of the statement is where we decide what we want to call the file object. In this case, it is f, but you can use any variable name.

with statements have a body, just like if statements. The body is indented, as you would expect. You can use the file object f normally within the body of the with-statement.

But when your code exits the body of the with , for any reason, the file object f will be closed. This happens if the code runs normally, or if any kind of error occurs.

Notice that we don't need to call the close function at all. It is done automatically in every case.

See also

If you found this article useful, you might be interested in the book NumPy Recipes or other books by the same author.

Join the PythonInformer Newsletter

Sign up using this form to receive an email when new content is added:

Popular tags

2d arrays abstract data type alignment and angle animation arc array arrays bar chart bar style behavioural pattern bezier curve built-in function callable object chain circle classes clipping close closure cmyk colour combinations comparison operator comprehension context context manager conversion count creational pattern data science data types decorator design pattern device space dictionary drawing duck typing efficiency ellipse else encryption enumerate fill filter font font style for loop formula function function composition function plot functools game development generativepy tutorial generator geometry gif global variable gradient greyscale higher order function hsl html image image processing imagesurface immutable object in operator index inner function input installing iter iterable iterator itertools join l system lambda function latex len lerp line line plot line style linear gradient linspace list list comprehension logical operator lru_cache magic method mandelbrot mandelbrot set map marker style matplotlib monad mutability named parameter numeric python numpy object open operator optimisation optional parameter or pandas partial application path pattern permutations pie chart pil pillow polygon pong positional parameter print product programming paradigms programming techniques pure function python standard library radial gradient range recipes rectangle recursion reduce regular polygon repeat rgb rotation roundrect scaling scatter plot scipy sector segment sequence setup shape singleton slice slicing sound spirograph sprite square str stream string stroke structural pattern subpath symmetric encryption template tex text text metrics tinkerbell fractal transform translation transparency triangle truthy value tuple turtle unpacking user space vectorisation webserver website while loop zip zip_longest