marcin2x4
marcin2x4

Reputation: 1439

try/except in list index out of range

I'm trying to rewrite some code for learning purposes and got stuck with implementing try/except part into the code.

Class FilePrep takes two arguments (file_name and path_dir`), the loop checks whether the file exists and returns entire path.

How to properly implement the handler part so error message will be clear rather then throwing list index out of range?

import xml.etree.ElementTree as element_tree
import fnmatch
import os
import errno

class FilePrep:
    def __init__(self, path_dir, file_name):
        self.path = path_dir
        self.file_name = file_name

    def get_source_file_path(self):
        source_file = []

        for file_name in os.listdir(self.path):
            try:
                if fnmatch.fnmatch(file_name, self.file_name):
                    source_file.append(file_name)
            except IndexError:
                print("file not found")


        source_file_old_name = str(source_file[0])
        file_path = os.path.join(self.path, source_file_old_name)
        
        return file_path

Function.py

import file_prep

file_path = file_prep.FilePrep('path', 'file_name*.xml')
print(file_path.get_source_file_path())

Upvotes: 0

Views: 677

Answers (2)

jgru
jgru

Reputation: 191

Your try/except-block is placed at the wrong place. Actually, the error occurs, when you're trying to access source_file[0], which is an empty list ([]) in case, that no file exists which matches the specified filename.

Therefore, I suggest to change it to the following implementation, where the lenght of the list, which should contain the matched files, is checked. If it is empty, a FileNotFoundError will be raised, like so:

        if not source_file:
            raise FileNotFoundError(f"No files matching '{self.file_name}'")

This results in the following class:

import xml.etree.ElementTree as element_tree
import fnmatch
import os
import errno

class FilePrep:
    def __init__(self, path_dir, file_name):
        self.path = path_dir
        self.file_name = file_name

    def get_source_file_path(self):
        source_file = []

        for file_name in os.listdir(self.path):
            if fnmatch.fnmatch(file_name, self.file_name):
                source_file.append(file_name)

        if not source_file:
            raise FileNotFoundError(f"No files matching '{self.file_name}'")

        source_file_old_name = str(source_file[0])
        file_path = os.path.join(self.path, source_file_old_name)

        return file_path

Upvotes: 1

Mahamudul Hasan
Mahamudul Hasan

Reputation: 2823

mainly problem into the below line:

source_file_old_name = str(source_file[0])

you can use below solution:

try:
    source_file_old_name = str(source_file[0])
except IndexError:
    return ""

file_path = os.path.join(self.path, source_file_old_name)
return file_path

Upvotes: 1

Related Questions