Thank you Kent, Chris, Danny,

This is superb, let me work on my part for now and I promise get back to the group with more ...

 
       _/_/      _/     _/
  _/       _/  _/   _/
 _/_/_/_/  _/ _/
_/      _/  _/   _/
_/     _/  _/      _/






Andrzej Kolinski wrote:
>
> I want to create a program that uses data from text files, makes
> appropriate calculations and produces report. First I need to find out
> what is the right way to retrieve appropriate information from an input
> file. This is a typical format of the input file:
>
> 1 Polonijna Liga Mistrzow        |from the heading portion
> 26 wrzesnia 2005                        |only
>  6 12 *6* *4* 1                                |'6' and '4' will be needed
>  0 1 0
> *Bohossian* - *Kolinski*                |all names and
> 1                                        |all scores
>       1.000 9 *13* 19                |(3rd column -
>       2.000 2 *4* 16                |'13', '4', '8', '6'
>       1.000 10 *8* 17                |will be needed
>       0.000 8 *6* 17                |
> *Szadkowska* - *Szczurek                *|
> 2                                        |same here
>       0.000 11 *16* 20                |
>       3.000 1 *-4* 14                |
>       3.500 3 *-7* 13
>       2.500 10 *13* 19          
> ..................
>
>  1 1                                        |skip the rest
>  1 1 1                                |(at least for now)

It's pretty simple to make an ad-hoc reader for this data. A couple of things you need:

- You can get individual lines from a file by treating it as an iterator. Instead of the usual
 f = open('data.txt')
 for line in f:
you can call f.next() to get a single line. This makes it easy to skip lines or process lines differently.

The call to f.next() will raise StopIteration when there are no more lines

- You can use split() to break a line into fields, then subscripting to pull out the data you want:
>>> line = '      1.000 9 13 19'
>>> line.split()
['1.000', '9', '13', '19']
>>> line.split()[2]
'13'
>>> int(line.split()[2])
13


With these tools the solution is pretty simple. I pull the data from a string but it will work with a file as well. I save the results in a dictionary which maps name to a list of scores.

data = '''1 Polonijna Liga Mistrzow
26 wrzesnia 2005
6 12 6 4 1
0 1 0
Bohossian - Kolinski
1
     1.000 9 13 19
     2.000 2 4 16
     1.000 10 8 17
     0.000 8 6 17
Szadkowska - Szczurek
2
     0.000 11 16 20
     3.000 1 -4 14
     3.500 3 -7 13
     2.500 10 13 19          
'''.split('\n')

#lines = open('data.txt')   # to get the data from a real file

lines = iter(data)  # getting data from a string, you don't need this when reading a file

lines.next()    # skip two headers
lines.next()

header = lines.next().split()
six = int(header[2])
four = int(header[3])
print six, four

lines.next()

allScores = {} # accumulate scores into a dictionary whose key is the name

# Now we can process the names and scores in a loop
try:    # you don't say how you know the end of the names, I just run to the end of data
   while True:
       name = lines.next().strip()

       lines.next()    # skip line after name
       scores = [ int(lines.next().split()[2]) for i in range(4) ]

       allScores[name] = scores
   
except StopIteration: # no more lines
   pass
   
for name, scores in allScores.items():
 print name, scores

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to