我有一个包含大量子目录(更多文件夹)的文件夹,每个子目录中都有csv文件。我想将相同的代码应用于子目录中的所有csv文件。如果我只为一个文件夹执行此操作,我会这样做:
list1=[]
pth=r'G:\Stefano\Ecoregion_assessment\csv_by_ecoregion_crp\05f08_46e'
for f in os.listdir(pth):
out=r'G:\Stefano\Ecoregion_assessment\final_files'
df=pd.read_csv(os.path.join(pth,f))
columns=['Percent', 'Land_Use', 'LC_Source']
df=df[columns]
df['Land_Use2']=df.Land_Use
df.rename(columns={'Percent': 'Percent_' +df.iloc[1,2], 'Land_Use': 'Land_Use_' +df.iloc[1,2]} , inplace=True)
df.drop(['LC_Source'], inplace=True, axis=1)
list1.append(df)
df_final = reduce(lambda left,right: pd.merge(left,right,on=['Land_Use2'], how='outer'), list1)
df_final.to_csv(os.path.join(out,'05f08_46e.csv'))
在这种情况下,G:\Stefano\Ecoregion_assessment\csv_by_ecoregion_crp
是导航到所有子目录的根,05f08_46e
是子目录之一。我想使用函数将相同的代码应用于根目录中的所有文件夹,然后将df_final
文件发送到out
以及正在循环的特定子目录的名称。我在G:\Stefano\Ecoregion_assessment\csv_by_ecoregion_crp
内有20个文件夹,因此我希望最后有20个输出文件到G:\Stefano\Ecoregion_assessment\final_files
。我只是想将我写的代码应用到所有20个文件夹,而无需手动更改文件夹路径。
另一种可能的方法是使用os.walk
,但我一直在玩它而没有成功。
答案 0 :(得分:1)
只需添加一个额外的循环。我试图重写你的代码,即使有些部分缺失而且我无法测试它,但我对此非常有信心:
pth=r'G:\Stefano\Ecoregion_assessment\csv_by_ecoregion_crp' # upper dir
out=r'G:\Stefano\Ecoregion_assessment\final_files' # out of the loop
for d in os.listdir(pth):
# 05f08_46e will be one of the "d" values
for f in os.listdir(os.path.join(pth,d)):
df=pd.read_csv(os.path.join(pth,f))
columns=['Percent', 'Land_Use', 'LC_Source']
df=df[columns]
df['Land_Use2']=df.Land_Use
df.rename(columns={'Percent': 'Percent_' +df.iloc[1,2], 'Land_Use': 'Land_Use_' +df.iloc[1,2]} , inplace=True)
df.drop(['LC_Source'], inplace=True, axis=1)
list1.append(df)
df_final = reduce(lambda left,right: pd.merge(left,right,on=['Land_Use2'], how='outer'), list1)
df_final.to_csv(os.path.join(out,d+'.csv'))