[Tutor] a quick Q: how to use for loop to read a series of files with .doc end

lina lina.lastname at gmail.com
Fri Oct 7 10:08:38 CEST 2011


On Fri, Oct 7, 2011 at 3:39 PM, lina <lina.lastname at gmail.com> wrote:

>
>
> On Fri, Oct 7, 2011 at 9:50 AM, Steven D'Aprano <steve at pearwood.info>wrote:
>
>> lina wrote:
>>
>>  May I ask a further question:
>>>
>>>  a
>>>>>>
>>>>> {'B': [4, 5, 6], 'E': {1, 2, 3}}
>>>
>>
>> Why is a['B'] a list and a['E'] a set?
>>
>>
>>
>>
>>  How can I get the value of
>>> set(a['E'])+set(a['B'])
>>>
>>> I mean, get a new dict 'B+E':[5,7,9]
>>>
>>
>>
>> You are confusing different things into one question, as if I had asked:
>>
>> "How do I make a hard boiled egg? I mean, get a potato salad."
>>
>> You must ask a clear question to get a clear answer.
>>
>>
>>
>> To answer your first question, what do you mean by adding two sets? I can
>> take the *union* of two sets (anything in either one OR the other):
>>
>> >>> a['E'] | set(a['B'])  # one is already a set, no need to convert
>> {1, 2, 3, 4, 5, 6}
>>
>>
>> or I can take the *intersection* of the two sets (anything in both one AND
>> the other):
>>
>> >>> a['E'] & set(a['B'])
>> set()
>>
>> There are no items in common between the two, so nothing in the
>> intersection.
>>
>>
>> To get the result you are asking for:
>>
>> [5, 7, 9]
>>
>> makes no sense. How do you expect to get a *list* by combining two *sets*?
>> They are different things. Lists have order, sets do not:
>>
>> >>> [1, 2, 3] == [3, 2, 1]
>> False
>> >>> {1, 2, 3} == {3, 2, 1}
>> True
>>
>>
>> A list is a sequence of values in order, a set is like a jumble of values
>> tossed in a bag.
>>
>> My *guess* is that you don't care about sets at all, you want two lists:
>>
>
> Thanks, I did not realize the great differences between the list and sets.
> I was not so sensitive about the concepts before.
>
>>
>>
>> [1, 2, 3]
>> [4, 5, 6]
>>
>>
>> and you want to add them item by item to get another list:
>>
>> [5, 7, 9]
>>
>>
>> Have I guessed correctly?
>>
>>
>> If so, here's the hard way to do it:
>>
>>
>> first_list = [1, 2, 3]
>> second_list = [4, 5, 6]
>> result = []
>> for i in range(3):
>>    a = first_list[i]
>>    b = second_list[i]
>>    result.append(a + b)
>>
>> print(result)
>>
>>
>> Walking along two lists in lock-step like that is so common that Python
>> has a dedicated function specially for it: zip.
>>
>> result = []
>> for a,b in zip(first_list, second_list):
>>    result.append(a+b)
>>
>>
>> which can be simplified further to a list comprehension:
>>
>> result = [a+b for a,b in zip(first_list, second_list)]
>>
>>
> Thanks, just why the output it's something double, more than I want.
>
> #!/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)
>             summary=[]
>             for a,b in zip(results['E'],results['B']):
>                 summary.append(a+b)
>         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(".")
>
>
>  $ 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]}
>
> $ more try.txt
> [1, 0, 1, 0, 1, 0][1, 0, 1, 0, 1, 0][1, 0, 1, 0, 1, 0][1, 0, 1, 0, 1, 0][1,
> 0, 1
> , 0, 1, 0][1, 0, 1, 0, 1, 0]
>
> $ more try.xpm
> aaEbb
> aEEbb
> EaEbb
> EaEbE
>
> Thanks,
>

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)
    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,


>
>>
>> --
>> Steven
>>
>> ______________________________**_________________
>> Tutor maillist  -  Tutor at python.org
>> To unsubscribe or change subscription options:
>> http://mail.python.org/**mailman/listinfo/tutor<http://mail.python.org/mailman/listinfo/tutor>
>>
>
>
>
> --
> Best Regards,
>
> lina
>
>
>


-- 
Best Regards,

lina
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20111007/d1d50ddf/attachment-0001.html>


More information about the Tutor mailing list