pjano1
pjano1

Reputation: 143

How to access the last filename in a directory in python

I'm trying to loop through some files in a directory. If the filename has two specific strings together, then I'm supposed to open and read those files for information. However, if none of the files have those two strings, I want to print an error message only once.

for filename in os.listdir(directory):
   if filename.find("<string1>") != -1 and filename.find("<string2>") != -1:
      #open file
   else:
      #print error message

I know doing this will print as many error messages as there are files in the directory (i.e. if there's 15 files with no matches, I'll get 15 error messages). But what I want is to only print an error message once after there aren't any matches in any of the N files in directory. I figured I could do something like this:

for filename in os.listdir(directory):
   if filename.find("<string1>") != -1 and filename.find("<string2>") != -1:
      #open file
   else:
      if filename[-1]: #if filename is last in directory
         #print error message

But I've discovered this doesn't work. How would I get an error message to print only after the last filename has been read and doesn't match?

Upvotes: 0

Views: 944

Answers (4)

han solo
han solo

Reputation: 6590

Not sure if this is extreme. But I'd make it a function and raise IOError. Plus, i'd always use absolute path. Try the pathlib module too

import os

def get_files(directory):
    for filename in os.listdir(directory):
        if "string1" in filename and "string2" in filename:
             yield filename
    raise IOError("No such file")

for file in get_files('.'):
    print(file)
    # do stuff with file

Upvotes: 0

Deepak V
Deepak V

Reputation: 319

Another way is to use a variable to check if all the files have been processed. Checked and found it working in Python 2.7

import os

directory = "E:\\test\\"
files_count = len(os.listdir(directory))
files_processed = 0
for filename in os.listdir(directory):
   if 'string1' in filename and 'string2' in filename:
      #open file
      print ("Opening file")
   else:
    files_processed = files_processed + 1
    if (files_processed >= files_count):
        print ("error message")

Upvotes: 0

thebjorn
thebjorn

Reputation: 27321

Filter the list of files before the for-loop:

filenames = [fname for fname in os.listdir(directory) 
             if '<string1>' in fname and '<string2>' in fname]
if filenames:
    for filename in filenames:
        #open file
else:
    #print error message

You can probably also use the glob module to get the filenames:

import glob
filenames = glob.glob(directory + '/*string1*string2*')

Upvotes: 1

InfiniteHigh
InfiniteHigh

Reputation: 202

A simple solution would be to initialize some boolean flag before your for loop, e.g. found = false

If you find a file, set found = true. Then you can check the value of found after your for loop finishes and print the appropriate message based on its value.

Upvotes: 2

Related Questions