CSC111 Homework 13 Solution Program 2014
--D. Thiebaut (talk) 16:59, 5 May 2014 (EDT)
Source
# hw13a.py
# D. Thiebaut
# This program reads several text files formatted in CSV format.
# Each file represents temperatures and rain fall data recorded
# for a specific city in the UK. The array temp below contains
# all the city names and their associated file names.
#
# The program prompts the user for a year and month and outputs
# the city that experienced the largest rain fall that period.
#
# Then the program outputs the city which recorded the largest
# difference between mean and max temperature in the year 2000
# or later.
#
# The final output is a list of all the cities sorted by year
# when a temperature recording was made for each. The list is
# sorted by year.
temp = [ ('Aberporth', 'aberporthdata.txt'),
('Armagh', 'armaghdata.txt'),
('Ballypatrick Forest', 'ballypatrickdata.txt'),
('Bradford', 'bradforddata.txt'),
('Braemar', 'braemardata.txt'),
('Camborne', 'cambornedata.txt'),
('Cambridge NIAB', 'cambridgedata.txt'),
('Cardiff Bute Park', 'cardiffdata.txt'),
('Chivenor', 'chivenordata.txt'),
('Cwmystwyth', 'cwmystwythdata.txt'),
('Dunstaffnage', 'dunstaffnagedata.txt'),
('Durham', 'durhamdata.txt'),
('Eastbourne', 'eastbournedata.txt'),
('Eskdalemuir', 'eskdalemuirdata.txt'),
('Heathrow', 'heathrowdata.txt'),
('Hurn', 'hurndata.txt'),
('Lerwick', 'lerwickdata.txt'),
('Leuchars', 'leucharsdata.txt'),
('Lowestoft', 'lowestoftdata.txt'),
('Manston', 'manstondata.txt'),
('Nairn', 'nairndata.txt'),
('Newton Rigg', 'newtonriggdata.txt'),
('Oxford', 'oxforddata.txt'),
('Paisley', 'paisleydata.txt'),
('Ringway', 'ringwaydata.txt'),
('Ross-on-Wye', 'rossonwyedata.txt'),
('Shawbury', 'shawburydata.txt'),
('Sheffield', 'sheffielddata.txt'),
('Southampton', 'southamptondata.txt'),
('Stornoway Airport', 'stornowaydata.txt'),
('Sutton Bonington', 'suttonboningtondata.txt'),
('Tiree', 'tireedata.txt'),
('Valley', 'valleydata.txt'),
('Waddington', 'waddingtondata.txt'),
('Whitby', 'whitbydata.txt'),
('Wick Airport', 'wickairportdata.txt'),
('Yeovilton', 'yeoviltondata.txt') ]
# getStats: reads the files and return 3 different dictionaries
# containing the data in various forms:
# fileNameOf: returns the file name associated with a given city
# nameOfFile: returns the city name associated with a given file
# linesOf: returns the list of lines of text associated with a given
# city
def getStats():
# init the dictionaries
fileNameOf = {}
nameOfFile = {}
linesOf = {}
# go through each file and record the data of interest
for i,pair in enumerate( temp ):
name = pair[0]
fileName = pair[1]
# update the dictionaries
fileNameOf[name] = fileName
nameOfFile[fileName] = name
file = open( fileName, 'r' )
linesOf[ name] = file.readlines()
file.close()
return linesOf, nameOfFile, fileNameOf
# The main program does all the work.
def main():
linesOf, nameOfFile, fileNameOf = getStats()
# get the year and month from the user (or constants)
wantedYear = 2011 #int( input( "please enter year: " ) )
wantedMonth = 11 #int( input( "please enter month: " ) )
# initializes
dico = {} # dictionary used to keep track of whether a
# year has been recorded for a given city,
list1 = [] # used to keep rain-fall data
list2 = [] # used to keep temperature differences
list3 = [] # used to record year of temp. recorded and cities
# go through each city
for i,(name, fileName) in enumerate( temp ):
# get the contents of the file from the dictionary
lines = linesOf[ name ]
# go through each line of the file
for line in lines:
# clean it up
line = line.strip().replace( '*', '' )
# does it start with a year?
if line[0:2] in [ "17", "18", "19", "20" ]:
# extract what we're after
words = line.split()
year = int( words[0] )
month= int( words[1] )
# see if we can get the rain-fall data
try:
if year==wantedYear and month==wantedMonth:
rain = float( words[5] )
list1.append( (rain, name ) )
except:
pass
# see if we can compute the difference in max/min temperatures
try:
diff = float( words[2]) - float( words[3] )
# if we're here, the temperatures are valid
if name not in dico:
# if this is the first time we're seeing a temperature
# for this city, record it
dico[name] = year
list3.append( (name, year) )
# if the year is 2000 or over, record the difference
if year >= 2000:
list2.append( (diff, name, month, year) )
except:
pass
# output abbreviated answer to Question 1
list1.sort()
list1.reverse()
print( "max rain found in %s, with %d mm" %
( list1[0][1], list1[0][0] ) )
# output abbreviated answer to Question 2
list2.sort()
list2.reverse()
print( "max diff found in %s with %1.3f difference temp (%d %d)" %
( list2[0][1], list2[0][0], list2[0][2], list2[0][3] ) )
for i in range( 1, len( list2 ) ):
if list2[i][0]==list2[0][0]:
print( "max diff found in %s with %1.3f difference temp (%d %d)" %
( list2[i][1], list2[i][0], list2[i][2], list2[i][3] ) )
else:
break
# output abbreviated answer to Question 3
list3 = [ (year, name) for name, year in list3 ]
list3.sort()
for name, year in list3:
print( "%4d %s" % (name, year ) )
main()
Output
max rain found in Dunstaffnage, with 244 mm
max diff found in Cambridge NIAB with 14.200 difference temp (7 2006)
1853 Oxford 1855 Southampton 1865 Armagh 1873 Stornoway Airport 1880 Durham 1883 Sheffield 1908 Bradford 1914 Eskdalemuir 1914 Lowestoft 1914 Wick Airport 1930 Lerwick 1930 Ross-on-Wye 1930 Tiree 1930 Valley 1931 Nairn 1934 Manston 1942 Aberporth 1947 Waddington 1948 Heathrow 1949 Ringway 1951 Chivenor 1957 Hurn 1957 Leuchars 1957 Shawbury 1959 Braemar 1959 Cambridge NIAB 1959 Cwmystwyth 1959 Eastbourne 1959 Newton Rigg 1959 Paisley 1959 Sutton Bonington 1961 Ballypatrick Forest 1961 Whitby 1964 Yeovilton 1972 Dunstaffnage 1977 Cardiff Bute Park 1978 Camborne