2017-01-20 5 views
1

Я меняю каталог в функции dirStuff.findFileInDir, но когда я распечатываю текущий рабочий каталог в jsonParsing.printDirtyJSON, он дает мне (новый) каталог, в который я изменился.Текущий путь к каталогу в python изменен в классе

Я думал, что занятия были самодостаточными. Я хочу, чтобы путь к старому каталогу был изменен. Класс dirStuff вызывается перед классом jsonParsing. Благодарю.

class dirStuff: 
    def __init__(self, dirName): 
     self.dirName = dirName 

    def doesDirExit(self): 
     isLuisModelDir = os.path.isdir(self.dirName) 
     if isLuisModelDir: 
      print("""directory exists - Calling the findFileInLuisDir function""") 
     else: 
      print("****directory does not exist. Exiting****") 
      sys.exit()   

    def findFileInDir(self): 
     print("found the directory containing the utterances") 
     os.chdir(self.dirName) 
     luisModelList=[] 
     for file in glob.glob("*.JSON"): 
      luisModelList.append(file) 
     return luisModelList    


class jsonParsing: 
    def __init__(self, dirName, fileName): 
     self.dirName = dirName 
     self.fileName = fileName 

    def printDirtyJSON(self): 
     luis_model_json = json.loads(open(self.fileName[1], encoding="utf8").read()) 

     #open output file 
     try: 
      utterances_output = open('utterances.txt', "w", encoding="utf8") 
      # redirect utterances to the output file 
      print(os.getcwd()) 
      for i in range(len(luis_model_json['utterances'])): 
       utterances = luis_model_json['utterances'][i]['text'] 
       #print(utterances)    
       utterances_output.write(utterances+"\n") 
       #close the file  
      utterances_output.close() 
     except IOError: 
      print(""" Could not open the utterances file to write to""") 
+0

'os.chdir' изменяет его для всех классов – Saksow

ответ

1

os.chdir изменяет текущий каталог в течение всего процесса. Если вы можете избежать этого, сделайте это.

В этом случае вы можете. Заменить этот код:

def findFileInDir(self): 
    print("found the directory containing the utterances") 
    os.chdir(self.dirName) 
    luisModelList=[] 
    for file in glob.glob("*.JSON"): 
     luisModelList.append(file) 
    return luisModelList 

по этому коду, который делает то же самое, но без необходимости изменения каталога:

def findFileInDir(self): 
    print("found the directory containing the utterances") 
    luisModelList=[] 
    for file in glob.glob(os.path.join(self.dirName,"*.JSON")): 
     luisModelList.append(os.path.basename(file)) 
    return luisModelList 

или более компактным, используя список понимание:

def findFileInDir(self): 
    print("found the directory containing the utterances") 
    return [os.path.basename(file) for file in glob.glob(os.path.join(self.dirName,"*.JSON"))] 

другим способом, используя os.listdir() и fnmatch модуль (os.listdir не добавляет текущий каталог на выход):

def findFileInDir(self): 
    print("found the directory containing the utterances") 
    return [file for file in os.listdir(self.dirName) if fnmatch.fnmatch(file,"*.JSON")] 

Родовой альтернатива была бы хранить старый путь, выполнить chdir и восстановить прежний путь:

previous_path = os.getcwd() 
os.chdir(new_path) 
... 
os.chdir(previous_path) 

но вы должны обрабатывать исключения (положить восстановление пути в finally блоке) чтобы избежать того, что при возникновении ошибки ваш путь остается неправильным. Я не рекомендую.

0

Если вы хотите сохранить тот же код и логику, вы можете сделать эти изменения:

class dirStuff: 
    def __init__(self, dirName): 
     self.dirName = dirName 
     self.currentDirName = os.getcwd() 

..... 


class jsonParsing: 
    def __init__(self, dirName, fileName, dirStuffObj): 
     self.dirName = dirName 
     self.fileName = fileName 
     self.currentDirName = dirStuffObj.currentDirName 

С dirStuffObj экземпляр dirStuff