Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Python – too many values to unpack while looking for a file

I’m trying to get a message that file not found when it doesn’t match the file_name*.txt pattern in specific directory.

When calling the script with file_name*.txt argument, all works fine. While entering invalid name file_*.txt throws:

File "etl.py", line 14, in main
path, file = file_path.get_source_file_path()
ValueError: too many values to unpack (expected 2)

Why is this happening?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

import fnmatch
import os

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)
        try:            
            source_file_name = str(source_file[0])
        except IndexError:
            return "file not found"
        
        file_path = os.path.join(self.path, source_file_name)
        return file_path, source_file_name

main.py

import file_prep
import xml.etree.ElementTree as element_tree
import pandas
import sys

def main():

    dir = sys.argv[1]
    file_input = sys.argv[2]

    #python3 etl.py /home/user/projects/python/folder/ file_name*.xml
    file_path = file_prep.FilePrep(dir, file_input)

    path, file = file_path.get_source_file_path()
    print(path)

>Solution :

Your problem is in this line in main.py:

path, file = file_path.get_source_file_path()

here you are unpacking the return value of get_source_file_path() into two variables. This works fine if the file exists (because you actually return two values) but does not when the file does not exist since you only return one value return "file not found".

To fix this I would raise an error instead of returning a string message in case of failure. Your code can become:

import fnmatch
import os

class FileNotFoundError(Exception):
    pass

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)
        try:            
            source_file_name = str(source_file[0])
        except IndexError:
            raise FileNotFoundError(f"file {self.file_name} not found")
        
        file_path = os.path.join(self.path, source_file_name)
        return file_path, source_file_name
import file_prep
import xml.etree.ElementTree as element_tree
import pandas
import sys

def main():

    dir = sys.argv[1]
    file_input = sys.argv[2]

    #python3 etl.py /home/user/projects/python/folder/ file_name*.xml
    file_path = file_prep.FilePrep(dir, file_input)

    try:
        path, file = file_path.get_source_file_path()
        print(path)
    except file_prep.FileNotFoundError as e:
        print(e)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading