On 10/07/2011 04:08 AM, lina wrote:
<snip>
I thought it might be some loop reason made it double output the results, so
I made an adjustation in indent, now it showed:
$ python3 counter-vertically-v2.py
{'B': [0, 0, 0, 0, 0, 0], 'E': [1, 0, 1, 0, 1, 0]}
{'B': [0, 0, 0, 0, 0, 0], 'E': [1, 0, 1, 0, 1, 0]}
[1, 0, 1, 0, 1, 0]
Traceback (most recent call last):
   File "counter-vertically-v2.py", line 48, in<module>
     dofiles(".")
   File "counter-vertically-v2.py", line 13, in dofiles
     processfile(filename)
   File "counter-vertically-v2.py", line 31, in processfile
     for a,b in zip(results['E'],results['B']):
KeyError: 'E'

still two results, but the summary is correct, with a KeyError which I don't
know how to fix the key error here.

#!/bin/python3

import os.path


TOKENS="BE"
LINESTOSKIP=0
INFILEEXT=".xpm"
OUTFILEEXT=".txt"

def dofiles(topdirectory):
     for filename in os.listdir(topdirectory):
         processfile(filename)

def processfile(infilename):
     results={}
     base, ext =os.path.splitext(infilename)
     if ext == INFILEEXT:
         text = fetchonefiledata(infilename)
         numcolumns=len(text[0])
         for ch in TOKENS:
             results[ch] = [0]*numcolumns
         for line in text:
             line = line.strip()
         for col, ch in enumerate(line):
             if ch in TOKENS:
                 results[ch][col]+=1
     for k,v in results.items():
         print(results)
That'll print the whole map for each item in it. Since you apparently have two items, "E" and "B", you get the whole thing printed out twice.

I have no idea what you really wanted to print, but it probably was k and v

     summary=[]
     for a,b in zip(results['E'],results['B']):
         summary.append(a+b)
     print(summary)
     writeonefiledata(base+OUTFILEEXT,summary)

def fetchonefiledata(inname):
     infile = open(inname)
     text = infile.readlines()
     return text[LINESTOSKIP:]

def writeonefiledata(outname,summary):
     outfile = open(outname,"w")
     for elem in summary:
         outfile.write(str(summary))


if __name__=="__main__":
     dofiles(".")

Thanks all for your time,


As for the reason you got the exception, it probably was because the NEXT file had no E's in it.

One of the reasons to break this stuff into separate functions is so you can test them separately. You probably should be calling processfile() directly in your top-level code, till it all comes out correctly. Or at least add a print of the filename it's working on.


Anyway, it's probably a mistake to ever reference "E" and "B" explicitly, but instead loop through the TOKENS. That way it'll still work when you add more or different tokens. Further, if it's considered valid for an input file not to have samples of all the tokens, then you have to loop through the ones you actually have. That might mean looping through the keys of results. Or, for the particular use case in that line, there's undoubtedly a method of results that will give you all the values in a list. That list would make an even better argument to zip(). Once again, I remind you of the dir() function, to see available methods.

--

DaveA

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to