Jed Rembold
November 7, 2022
What would be the output of the last print statement in the code to the right?
class Demo:
def __init__(self):
self.x = []
def add(self, v):
self.x.append(v)
def get_x(self):
return self.x
A, B = Demo(), Demo()
A.add(3)
B.add(3)
C = B.get_x()
C.append(A)
print(A.get_x() == B.get_x())
The general approach for reading a text file is to first open the file and associate that file with a variable, commonly called its file handle
We will also use the with keyword to ensure that Python
cleans up after itself (closes the file) when we are done with it (Many
of us could use a with irl)
with open(filename) as file_handle:
# Code to read the file using the file_handlePython gives you several different ways to actually read in the data
read reads the entire file in as a
stringreadline or
readlines reads a single line or lines from
the fileread alongside
splitlines gets you a list of line
stringsread method reads the entire file
into a string, with includes newline characters
(\n) to mark the end of linesAs an example, the file:
One fish
two fish
red fish
blue fish
would get read as
"One fish\ntwo fish\nred fish\nblue fish"
Of the ways to read the file in a string at a time, using the file handler as an iterator and looping is probably best and certainly most flexible
Leads to code that looks like:
with open(filename) as f:
for line in f:
# Do something with the lineNote that most strategies preserve the newline character, which you very likely do not want, so be ready to strip them out before doing more processing
So long as your files are not gigantic, using
read and then the
splitlines method can be a good
option
This does remove the newline characters, since it splits the string at them
with open(filename) as f:
lines = f.read().splitlines()
# Then you can do whatever you want with the list of linesIOErroropen encounters an error, it reports
the error by raising an exception with
IOError as its type.
tryPython uses the try statement to
indicate an interest in trying to handle a possible exception
In simplest form, the syntax is:
try:
# Code that may cause an exception
except type_of_exception:
# Code to handle that type of exceptiontype_of_exception here is the class
name of the exception being handled
IOError for the file reading errors we
are discussingAny exceptions arising from within the
try block or within functions
called within the try block would be “caught” and the lower
block of code run instead of terminating the program
As an example, the below function will repeatedly ask the user to supply a file name that actually exists.
It will not just immediately break should they give it an invalid filename!
def get_existing_file(prompt="Input a filename: "):
while True:
filename = input(prompt)
try:
with open(filename):
return filename
except IOError:
print("That filename is invalid!")If the open call succeeds, we
immediately just return the filename, but if it fails due to a
IOError, we display a message and then keep
asking
pgl.py also supports a mechanism to choose
files interactively, made available through the
filechooser.py library module.filechooser.py exports two functions:
choose_input_file for selecting a
filechoose_output_file for selecting a
folder and filename to save a file towith open(filename, mode) as file_handle:
# Code to write the file using file_handle
mode parameter to
open here! Mode is a string which is either
"w" to write a new file
(or overwrite an existing file)"a" to append new
contents to the end of an existing file.write(some_string) to write a string to
the file.writelines(iterable_of_strings) to
write each iterable element to the file