Files in Python
last modified October 18, 2023
In this part of the Python programming tutorial, we work with files and standard
input and output. We show how to read from a file and write to a file. We
briefly introduce the pickle module.
Everything in Python is an object. Everything in UNIX is a file.
Python open function
The open function is used to open files in Python.
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None)
The file is the name of the file to be opened. The mode indicates how the
file is going to be opened: for reading, writing, or appending.
The buffering is an optional integer used to set the buffering policy.
The encoding is the name of the encoding used to decode or encode the file.
The errors is an optional string that specifies how encoding and decoding
errors are to be handled. The newline controls the behaviour of the newline character.
The file modes are:
| Mode | Meaning | 
|---|---|
| 'r' | Reading (default) | 
| 'w' | Writing | 
| 'a' | Appending | 
| 'b' | Binary data | 
| '+' | Updating (reading and writing) | 
| 'x' | Exclusive creation, failing if file exists | 
In the following examples, we use this text file.
Lost Illusions Beatrix Honorine The firm of Nucingen Old Goriot Colonel Chabert Cousin Bette
Python with statement
Working with files leads often to errors; and therefore, we have to manage possible exceptions.
In addition, the file object must be closed when the file object is not needed anymore.
The with statement simplifies  exception handling by encapsulating common
preparation and cleanup tasks. It also automatically closes the opened file.
#!/usr/bin/env python
# read_width.py
with open('works.txt', 'r') as f:
    contents = f.read()
    print(contents)
The example reads the contents of the works.txt file.
with open('works.txt', 'r') as f:
With the open function, we open the works.txt file
for reading. The file object is aliased as f. The with
statement takes care of exceptions and the closing of the opened file.
contents = f.read()
The read method reads all the content until the EOF. It returns
the data as one big string.
Python read function
The read function reads the specified number of bytes from
the file. If the number of bytes is not specified, it reads the whole file.
#!/usr/bin/env python
# read_data.py
import sys
with open('works.txt', 'r') as f:
    print(f.read(5))
    print(f.read(9))
The code example read five letters from the file and prints them to the console. Then it reads and prints another nine letters. The second operation continues reading from the position where the first has ended.
$ ./read_data.py Lost Illusions
Python file positions
A file position is a place in the file from where we read data.
The tell method gives the current position in a file
and the seek method moves the position in a file.
#!/usr/bin/env python
# file_positions.py
with open('works.txt', 'r') as f:
    print(f.read(14))
    print(f"The current file position is {f.tell()}")
    f.seek(0, 0)
    print(f.read(30))
In the example, we read 14 bytes, then we determine and print
the current file position. We move the current file position
to the beginning with seek and read another 30 bytes.
$ ./file_positions.py Lost Illusions The current file position is 14 Lost Illusions Beatrix Honorin
Python readline method
The readline method reads a line from the file.
A trailing newline character is kept in the string. When
the function reaches the end of file, it returns an empty string.
#!/usr/bin/env python
# readbyline.py
with open('works.txt', 'r') as f:
    while True:
        line = f.readline()
        if not line:
            break
        else:
            print(line.rstrip())
With the readline method and a while loop,
we read all the lines from the file.
while True:
We start and endless loop; therefore, we must later jump of
the loop with a break statement.
line = f.readline()
A line is read from the file.
if not line:
    break
else:
    print(line.rstrip())
We call the break statement if we reach the EOF; otherwise,
we print the line to the console while stripping the newline character at
the end of the line.
In the following example, we use a more convenient way of going through the lines of the file.
#!/usr/bin/env python
# read_file.py
with open('works.txt', 'r') as f:
    for line in f:
        print(line.rstrip())
Internally, a file object is an iterarator. We can pass the file object to the for loop to traverse it.
Python readlines method
The readlines method reads data until the end of the file
and returns a list of lines.
#!/usr/bin/env python
# readlines.py
with open('works.txt', 'r') as f:
    contents = f.readlines()
    for i in contents:
        print(i.strip())
The readlines method reads all the contents of a file into the
memory. This may be problematic with very large files, though.
Python write method
The write method writes a string to a file.
#!/usr/bin/env python
# strophe.py
text = '''Incompatible, it don't matter though
'cos someone's bound to hear my cry
Speak out if you do
You're not easy to find\n'''
with open('strophe.txt', 'w') as f:
    f.write(text)
This time we open the file in a 'w' mode so that we can write into it. If the file does not exist, it is created. If it exists, it is overwritten.
$ cat strophe.txt Incompatible, it don't matter though 'cos someone's bound to hear my cry Speak out if you do You're not easy to find
Python standard I/O
There are three basic I/O connections: standard input, standard output and standard error. Standard input is the data that goes to the program. The standard input comes from a keyboard. Standard output is where we print our data with the print keyword. Unless redirected, it is the terminal console. The standard error is a stream where programs write their error messages. It is usually the text terminal.
The standard input and output in Python are objects located in the sys
module.
| Object | Description | 
|---|---|
| sys.stdin | standard input | 
| sys.stdout | standard output | 
| sys.stderr | standard error | 
Conforming to the UNIX philosophy, the standard I/O streams are file objects.
Python standard input
Standard input is the data that goes to the program.
#!/usr/bin/env python
# read_name.py
import sys
print('Enter your name: ', end='')
name = ''
sys.stdout.flush()
while True:
    c = sys.stdin.read(1)
    if c == '\n':
        break
    name = name + c
print('Your name is:', name)
The read method reads one character from the standard input. In
our example we get a prompt saying "Enter your name". We enter our name and
press Enter. The Enter key generates the new
line
character: \n.
$ ./read_name.py Enter your name: Peter Your name is: Peter
For getting input we can use higher level functions: input
and raw_input .
The input function prints a prompt if it is given and
reads the input.
#!/usr/bin/env python
# input_example.py
data = input('Enter value: ')
print('You have entered:', data)
$ ./input_example.py Enter value: Hello there You have entered: Hello there
Python standard output
The standard output is where we print our data.
#!/usr/bin/env python
# std_output.py
import sys
sys.stdout.write('Honore de Balzac, Father Goriot\n')
sys.stdout.write('Honore de Balzac, Lost Illusions\n')
In the example, we write some text to the standard output. This is in our
case the terminal console. We use the write method.
$ ./stdout.py Honore de Balzac, Father Goriot Honore de Balzac, Lost Illusions
The print function puts some text into the sys.stdout by default.
#!/usr/bin/env python
# print_fun.py
print('Honore de Balzac')
print('The Splendors and Miseries of Courtesans', 'Gobseck', 'Father Goriot', sep=":")
vals = [1, 2, 3, 4, 5]
for e in vals:
    print(e, end=' ')
print()
In this example, we use the sep and end parameters.
The sep separates the printed objects and the end defines
what is printed at the end.
$ ./print_fun.py Honore de Balzac The Splendors and Miseries of Courtesans:Gobseck:Father Goriot 1 2 3 4 5
It is possible to use the print function to write
to a file. The print function contains a file
parameter, which tells where we print data.
#!/usr/bin/env python
# print2file.py
with open('works.txt', 'w') as f:
    print('Beatrix', file=f)
    print('Honorine', file=f)
    print('The firm of Nucingen', file=f)
We open a file and write three titles of Balzac books into it.
The file object is given to the file parameter.
$ cat works.txt Beatrix Honorine The firm of Nucingen
Python redirection
Standard output can be redirected. In the following example, we redirect the standard output to a regular file.
#!/usr/bin/env python
# redirect.py
import sys
with open('output.txt', 'w') as f:
    sys.stdout = f
    print('Lucien')
    sys.stdout.write('Rastignac\n')
    sys.stdout.writelines(['Camusot\n', 'Collin\n'])
    sys.stdout = sys.__stdout__
    print('Bianchon')
    sys.stdout.write('Lambert\n')
In the redirect.py script, we redirect a standard output to a regular file
output.txt. Then we restore the original standard output back. The original
value of the std.output is kept in a special sys.__stdout__
variable.
$ ./redirect.py Bianchon Lambert $ cat output.txt Lucien Rastignac Camusot Collin
Python pickle module
So far, we have been working with simple textual data. What if we are
working with objects rather than simple text?
For such situations, we can use the pickle module.
This module serializes Python objects. The Python
objects are converted into byte streams and written to text files.
This process is called pickling. The inverse operation, reading from a
file and reconstructing objects is called deserializing or unpickling.
#!/usr/bin/env python
# pickle_ex.py
import pickle
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def get_name(self):
        return self.name
    def get_age(self):
        return self.age
person = Person('Monica', 15)
print(person.get_name())
print(person.get_age())
with open('monica', 'wb') as f:
    pickle.dump(person, f)
with open('monica', 'rb') as f2:
    monica = pickle.load(f2)
print(monica.get_name())
print(monica.get_age())
In our script, we define a Person class. We create one person. We pickle
the object using the dump
method. We close the file, open it again for reading, and unpickle the
object using the load method.
$ ./pickle_ex.py Monica 15 Monica 15
In this part of the Python tutorial, we work with files and standard input and output in Python.