背景:
我正在从世界银行导入几个df,它们的名称例如为“ 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文件名称的列表,并用“。”分隔各个名称。并为df创建一个新名称列表(见下文)
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]”关联的字符串,而不是返回可以采用指定值的对象。而且我知道评估是所有事情的根源……评估,但这是我能想到的全部事情。
TL / DR: 最终,我将使用相同的命名约定导入30多个文件,并且我希望能够导入它们并尽可能动态地根据旧名称为它们分配新名称。
我们将不胜感激!
答案 0 :(得分:1)
动态变量名的问题是它是Trojan Rabbit。定义动态变量后,
name = 'foo'
globals()[name] = 3
您可以用它做什么?如果我们在交互式提示下工作,那么很好-现在我们可以使用变量:
print(foo)
# 3
(但是,如果我们在交互式提示下工作,那为什么不能以常规方式定义foo
,例如foo = 3
?)
那么,既然我们正在编写代码(而不是在交互式提示下)what happens now?
我们知道新变量的名称与字符串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))
现在我们可以使用dfs[name]
来引用DataFrame。