Re: [Tutor] Searching through files for values

2015-08-14 Thread Jason Brown
(accidentally replied directly to Cameron)

Thanks, Cameron.  It looks like that value_file.close() tab was
accidentally tabbed when I pasted the code here.  Thanks for the suggestion
for using 'with' though!  That's will be handy.

To test, I tried manually specifying the list:

vals = [ 'value1', 'value2', 'value3' ]

And I still get the same issue.  Only the first value in the list is looked
up.

Jason

On Thu, Aug 13, 2015 at 7:32 PM, Cameron Simpson  wrote:

> On 13Aug2015 16:48, Jason Brown  wrote:
>
>> I'm trying to search for list values in a set of files.  The goal is to
>> generate a list of lists that can later be sorted.  I can only get a match
>> on the first value in the list:
>>
>> contents of value_file:
>> value1
>> value2
>> value3
>> ...
>>
>> The desired output is:
>>
>> file1 value1
>> file1 value2
>> file2 value3
>> file3 value1
>> ...
>>
>> Bit it's only matching on the first item in vals, so the result is:
>>
>> file1 value1
>> file3 value1
>>
>> The subsequent values are not searched.
>>
>
> Rhat is because the subsequent values are never loaded:
>
> filenames = [list populated with filenames in a dir tree]
>> vals = []
>> value_file = open(vars)
>> for i in value_file:
>>vals.append(i.strip())
>>value_file.close()
>>
>
> You close value_file inside the loop i.e. immediately after the first
> value.  Because the file is closed, the loop iteration stops.  You need to
> close it
> outside the loop (after all the values have been loaded):
>
>value_file = open(vars)
>for i in value_file:
>vals.append(i.strip())
>value_file.close()
>
> It is worth noting that a better way to write this is:
>
>with open(vars) as value_file:
>for i in value_file:
>vals.append(i.strip())
>
> Notice that there is no .close(). The "with" construct is the pynthon
> syntax to use a context manager, and "open(vars)" returns an open file,
> which is also a context manager. A context manager has enter and exit
> actions which fire unconditionally at the start and end of the "with", even
> if the with is exited with an exception or a control like "return" or
> "break".
>
> The benefit of this is after the "with", the file will _always" get
> closed. It is also shorter and easier to read.
>
> for file_list in filenames:
>>with open(file_list) as files:
>> for items in vals:
>> for line in files:
>> if items in line:
>> print file_list, line
>>
>
> I would remark that "file_list" is not a great variable name. Many people
> would read it as implying that its value is a list. Personally I would have
> just called it "filename", the singular of your "filenames".
>
> Cheers,
> Cameron Simpson 
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


[Tutor] Searching through files for values

2015-08-13 Thread Jason Brown
Hi,

I'm trying to search for list values in a set of files.  The goal is to
generate a list of lists that can later be sorted.  I can only get a match
on the first value in the list:

contents of value_file:
value1
value2
value3
...

The desired output is:

file1 value1
file1 value2
file2 value3
file3 value1
...

Bit it's only matching on the first item in vals, so the result is:

file1 value1
file3 value1

The subsequent values are not searched.

filenames = [list populated with filenames in a dir tree]
vals = []
value_file = open(vars)
for i in value_file:
vals.append(i.strip())
value_file.close()

for file_list in filenames:
with open(file_list) as files:
 for items in vals:
 for line in files:
 if items in line:
 print file_list, line



for line in vals:
print line

returns:
['value1', 'value2', 'value3']

print filenames

returns:
['file1', 'file2', 'file3']


Any help would be greatly appreciated.

Thanks,

Jason
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor