[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 16:18:29 CEST 2011


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

>
>
> 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():
>>
> My mistake, here should remove the "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:
>>
> another mistake here, I shouldn't have used "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.
>
>
> Now fixed the excessive output.

Thanks,

but in another case, seems there is a problem, for the line actually is:
"EEEEEEEEEEESEEEEEEEEEEEEEEEE~EEEEEEEEEEEE~EEEEEE~EEEEEEEEEE~EEEEEE~EEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEE~EEEEEEEEEEEEEEEEEEEEEEEE~EEE~EEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEE~EEEEEEEEEEEEEEEEEE~",

not naked EEEor whatever. it's already in ""

let me think think, and also welcome advice,

actually debugging is enjoyment after the frustration.


> #!/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
>
>
>


-- 
Best Regards,

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


More information about the Tutor mailing list