List data-member of object not updating inside loop. - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: List data-member of object not updating inside loop. (/thread-4620.html) |
List data-member of object not updating inside loop. - Sagar - Aug-30-2017 Hi all, I am new to Python programming and I am trying to write a code on sentiment analysis. I am taking dataset from the contents of text files (.txt). Firstly I have defined a Class called "FileClass" which has following members import glob from textblob import TextBlob class FileClass(object): fileName = "" lines = [] overallSentiment = "" def __init__(self,name): self.fileName = name def updateLines(self,line): self.lines.append(line) def updateSentiment(self,sentiment): self.overallSentiment = sentimentThen in another class I am handling File reading and Sentiment analysis job class FileClient(object): fileObjects = [] def __init__(self): lines = [] try: files = glob.glob('*.txt') for i,file_name in enumerate(sorted(files)): self.fileObjects.append(FileClass(file_name)) with open(file_name) as f: for line in f: singleLine = line.strip(' \t\n\r').split(".") for sl in singleLine: if (sl.strip(' \t\n\r') and len(sl.strip(' \t\n\r'))!=1): self.fileObjects[i].updateLines(sl.strip(' \t\n\r')) except Exception as e: print("Error: File reading error ", e) def get_line_sentiment(self, line): analysis = TextBlob(line) return analysis.sentiment.polarity def calculateFileOverallSentiment(self,fileObj): positiveSentiment = 0 neutralSentiment = 0 negativeSentiment = 0 for l in fileObj.lines: sentimentPolarity = self.get_line_sentiment(l) if sentimentPolarity > 0: positiveSentiment = positiveSentiment + 1 elif sentimentPolarity == 0: neutralSentiment = neutralSentiment + 1 else: negativeSentiment = negativeSentiment + 1 numOflines = len(fileObj.lines) positiveSentimentPer = (positiveSentiment * 100)/numOflines negativeSentimentPer = (negativeSentiment * 100)/numOflines neutralSentimentPer = (neutralSentiment * 100)/numOflines print("Positive Sentiments: ", positiveSentimentPer) print("Negative Sentiments: ", negativeSentimentPer) print("Neutral Sentiments: ", neutralSentimentPer) if positiveSentimentPer >= 33.33: fileObj.updateSentiment("positive") elif neutralSentimentPer >= 33.33: fileObj.updateSentiment("neutral") elif negativeSentimentPer >= 33.33: fileObj.updateSentiment("negative") else: fileObj.updateSentiment("CheckTheFuntion") return fileObj def set_sentiments(self): for f in self.fileObjects: print("Processing for: ", f.fileName) f = self.calculateFileOverallSentiment(f) def get_sentiments(self): for f in self.fileObjects: print("Overall sentiment of the file", f.fileName ," is: ", f.overallSentiment) for l in f.lines: print(l) print("*****************************************************") def main(): fileClient = FileClient() fileClient.set_sentiments() fileClient.get_sentiments() if __name__ == "__main__": # calling main function main()In the class FileClient, inside init function, I am appending an object of type FileClass on finding a text file inside the current folder. I am facing a issue that the lines that I have updated for first text file inside FileClass object in fileObjects list is getting updated for rest of FileClass objects inside the fileObjects list Like I am having 3 text files HarryBrown.txt, TheGhostWriter.txt and UpInTheAir.txt and they are having different contents. But on running my code I am getting an output like this: You can see that Content for HarryBrown.txt is showing for all other files.Please advise me where I am doing it wrong. Thanks RE: List data-member of object not updating inside loop. - buran - Aug-30-2017 you mix class and instance variables. This is common gotcha when one is inexperienced with classes - don't worry :-) RE: List data-member of object not updating inside loop. - Sagar - Aug-30-2017 Thanks for the help. Now I got it and corrected myself like this: import glob from textblob import TextBlob class FileClass(object): def __init__(self,name): self.fileName = name self.lines = [] self.overallSentiment = "" def updateLines(self,line): self.lines.append(line) def updateSentiment(self,sentiment): self.overallSentiment = sentiment class FileClient(object): def __init__(self): self.fileObjects = [] try: files = glob.glob('*.txt') for i,file_name in enumerate(sorted(files)): self.fileObjects.append(FileClass(file_name)) with open(file_name) as f: for line in f: singleLine = line.strip(' \t\n\r').split(".") for sl in singleLine: if (sl.strip(' \t\n\r') and len(sl.strip(' \t\n\r'))!=1): self.fileObjects[i].updateLines(sl.strip(' \t\n\r')) except Exception as e: print("Error: File reading error ", e) def get_line_sentiment(self, line): analysis = TextBlob(line) return analysis.sentiment.polarity def calculateFileOverallSentiment(self,fileObj): positiveSentiment = 0 neutralSentiment = 0 negativeSentiment = 0 for l in fileObj.lines: sentimentPolarity = self.get_line_sentiment(l) if sentimentPolarity > 0: positiveSentiment = positiveSentiment + 1 elif sentimentPolarity == 0: neutralSentiment = neutralSentiment + 1 else: negativeSentiment = negativeSentiment + 1 numOflines = len(fileObj.lines) positiveSentimentPer = (positiveSentiment * 100)/numOflines negativeSentimentPer = (negativeSentiment * 100)/numOflines neutralSentimentPer = (neutralSentiment * 100)/numOflines print("Positive Sentiments: ", positiveSentimentPer) print("Negative Sentiments: ", negativeSentimentPer) print("Neutral Sentiments: ", neutralSentimentPer) if positiveSentimentPer >= 33.33: fileObj.updateSentiment("positive") elif neutralSentimentPer >= 33.33: fileObj.updateSentiment("neutral") elif negativeSentimentPer >= 33.33: fileObj.updateSentiment("negative") else: fileObj.updateSentiment("CheckTheFuntion") return fileObj def set_sentiments(self): for f in self.fileObjects: print("Processing for: ", f.fileName) f = self.calculateFileOverallSentiment(f) def get_sentiments(self): for f in self.fileObjects: print("Overall sentiment of the file", f.fileName ," is: ", f.overallSentiment) for l in f.lines: print(l) print("*****************************************************") def main(): fileClient = FileClient() fileClient.set_sentiments() fileClient.get_sentiments() if __name__ == "__main__": # calling main function main()And I am getting the result as expected. I want to ask a question that if I declare a class variable and an instance variable having same name like I have done in "FileClass" class, are they different or same ? and thanks again. |