====== Computer Lab 07, Files ======
* Q/A
* Practical work
===== Practical work =====
==== Count characters, words, and lines in a file ====
In module ''texttools.py'', create a function ''count()'' that will return a triple consisting of the number of characters (including white space, but excluding new-line characters), words, and lines in a text file, given to the function as argument.
def count(filepath):
"""Return number of characters, words, and lines in the given file
:param filepath: string, path to a text file
:return: 3-tuple with number of chars, words, and lines in the file
"""
If we had a file named ''example.txt'' in the current directory with the following contents
One two three,
dee dah dee.
Four, five, six,
what a mix!
we could execute the code and get results like this:
>>> print(count('example.txt'))
(53, 12, 4)
==== Inserting line numbers ====
In module ''texttools.py'', create function ''insert_line_numbers()'' which shall read the input text file line by line, aend write them into an output text file such that each line will start with an ''n''-digit long line number and a space, starting from 1. The default value for ''n'' is 3.
def insert_line_numbers(in_filepath, out_filepath, num_len=3):
"""Create a copy of the input file with numbered lines
:param in_filepath: string, path to the input text file
:param out_filepath: string, path to the output text file
:param num_len: int, the length of the string containg the line number
:return: None
"""
Running the function on the text file from the previous exercise like this:
>>> insert_line_numbers('example.txt', 'numbered_example.txt', num_len=2)
will create file ''numbered_example.txt'' in the current directory with the following contents:
1 One two three,
2 dee dah dee.
3 Four, five, six,
4 what a mix!
Try to apply this function to some of your ''.py'' files!
==== Removing the line beginnings ====
In module ''texttools.py'', create function ''snip_line_beginnings()'' that can be used to undo the line numbering (but can be used in more general cases).
def snip_line_beginnings(in_filepath, out_filepath, n=4):
"""Create a copy of the input file with the first n chars of each line snipped off.
:param in_filepath: string, path to the input text file
:param out_filepath: string, path to the output text file
:param n: int, the number of chars to snip from the beginning of each line
:return: None
"""
==== Chemical elements database ====
Let's have a file with a simple database of chemical elements, named e.g. ''elements.txt'', with the following contents:
berryllium 4 9.012
magnesium 12 24.305
calcium 20 20.078
strontium 38 87.62
barium 56 137.327
radium 88 226
For each stored chemical element, its respective line in a file contains the element name, atomic number and atomic weight.
Write function ''read_elements()'' that will accept a path to the file with element database, will read the information therein, and will produce a list of lists, where each inner list will contain data for individual element, i.e. its name (string), its atomic number (int), and atomic weight (float).
def read_elements(filepath):
"""Return a list of lists with info about chem. elements read from the given file
:param filepath: string, path to a file with the elements database
:return: list of lists of , each inner list containing name (string), number (int),
and weight (float) for each element.
When the function is used to read in the above file, it should produce the following:
>>> read_elements('elements.txt')
[['berryllium', 4, 9.012], ['magnesium', 12, 24.305], ['calcium', 20, 20.078], ...]
===== Homework =====
* Finish all the above tasks.
* Read [[http://openbookproject.net/thinkcs/python/english3e/files.html|chapter 13 - Files]] of {[a4b99rph:Wenthworth]}.