使用原始文件名的一部分动态命名导入 Python 的数据帧
Dynamically naming DataFrames imported into Python using portions of original file name
背景:
我正在从世界银行导入几个 df,它们的名称如“API_AG.SRF.TOTL.K2_DS2_en_csv_v2_10366083.csv
”。我有几个具有类似命名约定的文件保存在我计算机上的同一文件夹中。
OBJECTIVE:
最后我想导入所有这些文件并根据原始文件名为它们分配名称。具体来说,我想在“。”上划定原始名称。并将每个 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 多个具有相同命名约定的文件,我希望能够导入它们并尽可能动态地根据旧名称为它们分配新名称。
如果您能提供任何帮助,我们将不胜感激!
动态变量名的问题是它是 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
背景:
我正在从世界银行导入几个 df,它们的名称如“API_AG.SRF.TOTL.K2_DS2_en_csv_v2_10366083.csv
”。我有几个具有类似命名约定的文件保存在我计算机上的同一文件夹中。
OBJECTIVE:
最后我想导入所有这些文件并根据原始文件名为它们分配名称。具体来说,我想在“。”上划定原始名称。并将每个 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 多个具有相同命名约定的文件,我希望能够导入它们并尽可能动态地根据旧名称为它们分配新名称。
如果您能提供任何帮助,我们将不胜感激!
动态变量名的问题是它是 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]
.