스크립트로 여러 개의 하위 디렉토리로 반복하고 하위 디렉토리에있는 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'))
귀하의 가정이 잘못되었을 수 있습니다. 첫 번째'if' 문이 실행되지 않으면'df1'은 정의되지 않았지만'df1'과'df2'를 병합하려고 시도합니다. 파일이 존재하는지 확인하십시오. –
'os.path.isfile (filepath)'는 첫 번째 파일에 대해 False를 반환하는 것처럼 보입니다. 확인해 봤어? – ayhan
루프를 변경하여 스크립트를 중지하는 대신 모든 파일을 포함하지 않는 하위 디렉터리를 건너 뛴 다음 파일이 포함 된 하위 디렉터리를 계속 사용할 수 있습니까? – Gravel