====== 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]}.