1

I have a .yaml file (params) which contains a dictionary of names

country_names:
    country_1: Wales
    country_2: England
    country_3: Scotland
    country_4: 

As you can see, country_4 is left empty. This is intentional. In the interest of scalability and user friendliness, I want to be able to run the script with a known maximum number of country_names (i.e. 4) but an unknown number of country values. I also don't want to have to hardcode the script every time someone makes a change to the yaml.

import dictor
import geopandas as gpd
import pandas as pd
import yaml

country_1 = dictor(params, 'country_names.country_1')
if country_1 is None:
    del country_1
else: 
    country_1_path = path_to_dir + '/' + country_1 + '.geojson'
    country_1 = gpd.read_file(country_1)

country_2 = dictor(params, 'country_names.country_2')
if country_2 is None:
    del country_2
else: 
    country_2_path = path_to_dir + '/' + country_2 + '.geojson'
    country_2 = gpd.read_file(country_2)

country_3 = dictor(params, 'country_names.country_3')
if country_3 is None:
    del country_3
else: 
    country_3_path = path_to_dir + '/' + country_3 + '.geojson'
    country_3 = gpd.read_file(country_3)

country_4 = dictor(params, 'country_names.country_4')
if country_4 is None:
    del country_4
else: 
    country_4_path = path_to_dir + '/' + country_4 + '.geojson'
    country_4 = gpd.read_file(country_4)          

and then I concatenate the country variables that are produced above...

try:
   countries = pd.concat([country_1, country_2, country_3, country_4])
except:
    pass
        try:
            countries = pd.concat([country_1, country_2, country_3])
        except:
            pass 
            try:
                countries = pd.concat([country_1, country_2])
            except:
                pass

The script does exactly what I want it do and doesn't fall over. However, as you can see, the LOC count is quite high and it's quite messy. Is there a more efficient or Pythonic way of doing this whilst keeping things explicit rather than implicit? Also I am happy for other suggestions, for example, if I am using except and pass incorrectly.

*I'm also happy to change the question title if anyone has suggestions.

1 Answer 1

2

You can do it this way, for example:

# The variables that exist, country_2 and country_4 were not initialized
country_1 = 0
country_3 = 1

countries = []
for i in range(1, 5):
    if f'country_{i}' in globals():
        countries.append(globals()[f'country_{i}'])
print(countries)

[0, 1]

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.