2017-05-04 1 views
0

스크립트로 여러 개의 하위 디렉토리로 반복하고 하위 디렉토리에있는 3 개의 파일로 구성된 데이터 프레임을 만듭니다. 나는 각 하위 디렉토리에 각 하위 디렉토리의 출력을 쓰고 싶어하지만, 내 코드는 오류 제공 : 모든 파일이 존재한다는이 사실로 인해 아마파일이 없으면 루핑을 계속하는 파이썬 스크립트를 변경하는 방법

dfmerge1 = pd.merge(df1, df2, on=['genome', 'contig'], how='outer') 

으로 줄에서 "정의되지 DF1을" 하위 디렉토리와 스크립트가 중지됩니다. 하나의 하위 디렉토리에 세 개의 파일이 모두 포함되어 있지 않으면 스크립트는 다음 하위 디렉토리로 계속 진행되기를 원합니다. 어떻게해야합니까?

내 코드가 제대로 filepath의 존재를 확인하고 있지만이 파일이 존재하지 않는 경우 처리되지

import os 
import pandas as pd 

print('Start merging contig files') 

for root, dirs, files in os.walk(os.getcwd()): 
    filepath = os.path.join(root, 'genes.faa.genespercontig.csv') 
    if os.path.isfile(filepath): 
     with open(filepath, 'r') as f1: 
      df1 = pd.read_csv(f1, header=None, delim_whitespace=True, names = ["contig", "genes"]) 
      df1['genome'] = os.path.basename(os.path.dirname(filepath)) 

    filepath = os.path.join(root, 'hmmer.analyze.txt.results.txt') 
    if os.path.isfile(filepath): 
     with open(filepath, 'r') as f2: 
      df2 = pd.read_csv(f2, header=None, delim_whitespace=True, names = ["contig", "SCM"]) 
      df2['genome'] = os.path.basename(os.path.dirname(filepath)) 

    filepath = os.path.join(root, 'genes.fna.output_blastplasmiddb.out.count_plasmiddbhit.out') 
    if os.path.isfile(filepath): 
     with open(filepath, 'r') as f3: 
      df3 = pd.read_csv(f3, header=None, delim_whitespace=True, names = ["contig", "plasmid_genes"]) 
      df3['genome'] = os.path.basename(os.path.dirname(filepath)) 

    #merge dataframes 
    dfmerge1 = pd.merge(df1, df2, on=['genome', 'contig'], how='outer') 
    df_end = pd.merge(dfmerge1, df3, on=['genome', 'contig'], how='outer') 

    #set NaN in columns to 0 
    nan_cols = df_end.columns[df_end.isnull().any(axis=0)] 
    for col in nan_cols: 
     df_end[col] = df_end[col].fillna(0).astype(int) 

    df_end.to_csv(os.path.join(root, 'outputgenesdf.csv')) 
+2

귀하의 가정이 잘못되었을 수 있습니다. 첫 번째'if' 문이 실행되지 않으면'df1'은 정의되지 않았지만'df1'과'df2'를 병합하려고 시도합니다. 파일이 존재하는지 확인하십시오. –

+0

'os.path.isfile (filepath)'는 첫 번째 파일에 대해 False를 반환하는 것처럼 보입니다. 확인해 봤어? – ayhan

+0

루프를 변경하여 스크립트를 중지하는 대신 모든 파일을 포함하지 않는 하위 디렉터리를 건너 뛴 다음 파일이 포함 된 하위 디렉터리를 계속 사용할 수 있습니까? – Gravel

답변

1

입니다. 따라서 파일이 없으면 df1은 이전 루프 반복의 남은 값이거나 루프를 처음 통과하는 경우 undefined입니다.

if os.path.isfile(filepath): 
    with open(filepath, 'r') as f1: 
     df1 = pd.read_csv(f1, header=None, delim_whitespace=True, names = ["contig", "genes"]) 
     df1['genome'] = os.path.basename(os.path.dirname(filepath)) 
else: 
    continue 
+0

예, 작동합니다. 대단히 감사합니다! – Gravel

관련 문제