Динамическое именование DataFrames, импортируемых в Python, используя части исходного имени файла - PullRequest
0 голосов
/ 28 января 2019

ПРЕДПОСЫЛКИ:
Я импортирую несколько DFS из Всемирного банка, которые имеют такие имена, как "API_AG.SRF.TOTL.K2_DS2_en_csv_v2_10366083.csv".У меня есть несколько таких файлов со схожими соглашениями об именах, которые хранятся в одной папке на моем компьютере.

ЦЕЛЬ:
В конце я хочу импортировать все эти файлы и назначить ихимена основаны на оригинальных именах файлов.В частности, я хочу разделить оригинальное имя на "."и назовите каждый df "country" + "_" + str(delimitedname[1]) + "_" + str(delimitedname[2])).lower() (например, в случае "API_AG.SRF.TOTL.K2_DS2_en_csv_v2_10366083.csv." df будет назван "country_srf_totl."

У меня уже есть код, который создает список имен всех CSVфайлы в папке, разделяет соответствующие имена на «.» и создает список новых имен для dfs (см. ниже)

grab_files = []
for folders, subfolders, files in os.walk(r'filepath'):
    for file in files:
        if file.endswith('.csv'):
            grab_files.append(str(file))

names = []
for i in range(0,len(grab_files)):
    name0 = grab_files[i].split(".")
    names.append(str("country" + "_" + str(name0[1]) + "_" + str(name0[2])).lower())

print(names)

В результате получается следующий список:

['country_pop_totl_ds2_en_csv_v2_10307762', 'country_gdp_mktp', 'country_gdp_mktp', 'country_srf_totl']

ВЫПУСК: Проблема на самом деле заключается в назначении этих имен во время части импорта моего кода.

Вот то, что я пытался изначально (Примечание: «fp0» - это определенный путь к файлупапка, содержащая файлы csv):

for i in range(0,len(names)):
    eval('names[i]') = pd.read_csv(fp0 + str(grab_files[i]))

Я знаю, что проблема в том, что eval возвращает строку, связанную с 'names [i]', а не объект, который может принимать назначенное значение.И я знаю, что EVAL - это корень всех вещей ... EVAL, но это все, что я мог подумать.

TL / DR: В конце концов я собираюсь импортировать 30+файлы с тем же соглашением об именах, и я хотел бы иметь возможность импортировать их и назначить ихновые имена основаны на старых именах как можно более динамично.

Любая помощь, которую вы можете оказать, будет принята с благодарностью!

1 Ответ

0 голосов
/ 28 января 2019

Проблема с именами динамических переменных в том, что это Trojan Rabbit .Как только вы определили динамическую переменную,

name = 'foo'
globals()[name] = 3

, что вы можете с ней сделать?Если мы работаем с интерактивной подсказкой, тогда хорошо - теперь мы можем использовать нашу переменную:

print(foo)
# 3

(Но если мы работали с интерактивной подсказкой, то почему мы не могли просто определить * 1009?* нормальным способом, например foo = 3?)

Итак, поскольку мы пишем код (а не в интерактивном режиме) что происходит сейчас ?Мы знаем, что новая переменная имеет то же имя, что и значение строки name.Но мы не знаем значение name.У нас есть только name.

Так что даже после определения глобальной переменной с помощью globals()[name] = 3 мы все равно вынуждены обращаться к ней через name:

print(globals()[name])

Ну,это просто ... отстой.

Мы могли бы также использовать dict вместо globals(), чтобы не загрязнять глобальное пространство имен:

dfs = dict()
for name, grab_file in zip(names, grab_files):
    dfs[name] = pd.read_csv(fp0 + str(grab_file))

и теперь мы можемобратитесь к DataFrame, используя dfs[name].

...