(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 <c...@zip.com.au> wrote: > On 13Aug2015 16:48, Jason Brown <zero...@gmail.com> 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 <c...@zip.com.au> > _______________________________________________ > 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