2016-06-14 91 views
0

我有一个包含许多子目录(更多文件夹)的文件夹,每个子目录中都有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,但我一直在玩弄它,但没有成功。

回答

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')) 
相关问题