Передайте файл, открытый в функции, другой функции для его анализа на python

#python

Вопрос:

Я использую функцию, позволяющую моему пользователю открывать файл нажатием кнопки.

 def open():
    global img
    file = filedialog.askopenfilename(filetypes =(("Text File", "*.txt"),("All Files","*.*")), title = "Select")
    txt = []    
    with open(file, "r", encoding='utf-8') as f:          
    [...]
    outputData = pd.DataFrame(txt)
    return txt  
 

После этого, нажав другую кнопку, также следует начать некоторый анализ с использованием pandas, но как я могу использовать фрейм данных, который я создаю в этой функции ниже?

 def analyze():  
    total = len(outputData)
 

Это ошибка, которую я получаю: «Ошибка: Ошибка имени: имя ‘OutputData’ не определено»
После того, как кто-то нажмет кнопку «Анализ», я хотел бы также отобразить результат в «total_label», чтобы его мог видеть мой пользователь.

 sel_btn = Button(frame, command=open)
an_btn = Button(frame, command=analyze)
total_label = Label(frame, textvariable='total')
sel_btn.pack()
an_btn.pack()
total_label.pack()
 

Спасибо!

РЕДАКТИРОВАТЬ Я все еще получаю некоторую ошибку, вот эту: «Ошибка типа: analyze_chat() отсутствует 1 требуемый позиционный аргумент: ‘OutputData'»

Это мой полный код

 def open():
    global img
    file = filedialog.askopenfilename(filetypes =(("Text File", "*.txt"),("All Files","*.*")), title = "Select Chat")
    txt = []    
    exclude_string = "Tap for more info."
    with open(file, "r", encoding='utf-8') as f:
            for line in f:
                lines = line.split(' - ')  # Divide between date and the rest
                if len(lines) > 1:
                    if not lines[1].__contains__(exclude_string):
                        lines2 = lines[1].split(': ')  # Divide between user and text
                        if len(lines2) > 1:
                            sender = lines2[0]
                            text = lines2[1]
                            time = lines[0]
                            txt  = [[time, sender, text]]

    

    outputData = pd.DataFrame(txt, columns=['datetime', 'sender', 'text'])  
    outputData.to_csv('output2.csv', index=False, line_terminator='n', encoding='utf-8')

    analyze(outputData) 

    select_btn['command']=0
    select_btn.config(image=step1_2_img, relief=SUNKEN)
    analyze_btn.config(image=step2_2_img)   

    return txt


def analyze(outputData):    
    total = len(outputData)
    
 

Комментарии:

1. Поскольку ваша ошибка связана со ссылкой analyze_chat , которой нет в вашем коде, я предполагаю, что это не абсолютно все, вы проверили, есть ли analyze_chat требуемый аргумент?

2. Измените текст своей этикетки, сделав это total_label.config(text=analysis)

Ответ №1:

 def open():
   [code_here]
   outputData = pd.DataFrame(txt)
   analyze(outputData) #this basically passes the variable to the function
 

и в функции анализа

 def analyze(outputData):
   total = len(outputData)
 

так что для более легкого понимания

 def first():
   passme = 'text'
   second(passme)
def second(passme):
   print(passme)
 

Это позволит печатать текст во второй функции

Переменная передается и вызывается

Надеюсь, это поможет, я тоже учусь

ОТРЕДАКТИРУЙТЕ Приведенный ниже код

     analyze(outputData) 

    select_btn['command']=0
    select_btn.config(image=step1_2_img, relief=SUNKEN)
    analyze_btn.config(image=step2_2_img)   

    return txt
 

в

     select_btn['command']=0
    select_btn.config(image=step1_2_img, relief=SUNKEN)
    analyze_btn.config(image=step2_2_img) 
  
    return txt
    analyze(outputData)
 

или

     select_btn['command']=0
    select_btn.config(image=step1_2_img, relief=SUNKEN)
    analyze_btn.config(image=step2_2_img)   

    analyze(outputData, txt)

    def analyze(outputData, txt):
    [YOUR CODE HERE]
 

Комментарии:

1. ПРИМЕЧАНИЕ: обучение передаче материала через функции

2. Спасибо, я попробовал ваше решение. Но я все еще получаю ошибку. Я отредактировал свой вопрос, надеясь, что будет легче понять, что я делаю не так

3. в настоящее время вы получаете «Ошибка типа: analyze_chat() отсутствует 1 требуемый позиционный аргумент: ‘OutputData'», потому что вы не передаете выходные данные в analyze_chat()

4. попробуйте поместить analyze(outputData) ниже return txt

5. @DianaMele проверьте мой ответ еще раз и попробуйте это, и если это не сработает, попробуйте удалить return txt , затем изменить analyze(outputData) на analyze(outputData, txt) , а затем добавить txt в def analyze(outputData): лайк def analyze(outputData, txt):