从另一个文件调用Python函数并使用该函数的DF

从另一个文件调用Python函数并使用该函数的DF,python,pandas,function,Python,Pandas,Function,我有一个名为Pre_processing_file.py的文件。此文件预处理文本文件(工作正常) 我现在要做的是,我有一个单独的.py文件,名为naming.py。 在naming.py文件中,我想调用Pre_processing_file.py中的函数,然后以excel格式保存预处理的文件。(见下面的当前代码) 预处理文件-我省略了大部分预处理代码。该脚本打开一个GUI,接收两个输入文件dir1和dir2,并对它们进行本质上的比较 from tkinter import * # impo

我有一个名为Pre_processing_file.py的文件。此文件预处理文本文件(工作正常)

我现在要做的是,我有一个单独的.py文件,名为naming.py。 在naming.py文件中,我想调用Pre_processing_file.py中的函数,然后以excel格式保存预处理的文件。(见下面的当前代码)

预处理文件-我省略了大部分预处理代码。该脚本打开一个GUI,接收两个输入文件dir1和dir2,并对它们进行本质上的比较

from tkinter import *
  
# import filedialog module
from tkinter import filedialog

def pre_Processing(dir1,dir2):
    
    
    ## Import Libraries
    import pandas as pd
    import numpy as np
    from pandas import DataFrame
    
    
    ######################################################################################################################
    ######################################################################################################################
    ## Read in the single long column, and then form a group indicator by seeing where the value is '[User]'. Then separate the 
    ## column labels and values, with a str.split and join back to your DataFrame. Finally pivot to your desired shape.
    
    userListing_DF = pd.read_csv(dir1, sep='\n', header=None)

    userListing_DF['Group'] = userListing_DF[0].eq('[User]').cumsum()
    userListing_DF = userListing_DF[userListing_DF[0].ne('[User]')]  # No longer need these rows

    userListing_DF = pd.concat([userListing_DF, userListing_DF[0].str.split('=', expand=True).rename(columns={0: 'col', 1: 'val'})],
                               axis=1)

    userListing_DF = userListing_DF.pivot(index='Group', columns='col', values='val').rename_axis(columns=None)
    
 
    
    return userListing_DF 

dir1 =  filedialog.askopenfile(mode="r", initialdir="/", title="select file",
                                       filetypes=(("text files", "*.txt"), ("all files", "*.*")))

dir2 = filedialog.askopenfile(mode="rb", initialdir="/", title="Select the second file",
                                       filetypes=(("Excel files", "*.xlsx"), ("all files", "*.*")))

pre_Processing(dir1,dir2)
我遇到的问题是,我不确定如何调用在Pre_processing_File.py中创建的df,以便命名它,然后将其保存为excel。
我知道在这种情况下不需要2个文件,但有一种方法可以让我发疯,因此对此场景的任何帮助都将不胜感激。

您可以使
pre_Processing()
返回它创建的数据帧,然后在
naming()
的内部使用它来获得数据帧,如:

def naming():
from Pre_Processing_File import pre_Processing

    df = pre_Processing(dir1,dir2)

请注意,如果Pre_processing_File.py位于naming.py以外的另一个目录中,则在
naming()

中的赋值过程中,您必须相应地更新
dir1
dir2
,好的,我不太确定您想做什么(因为这只是代码的一部分),因此,我的一些更改可能与代码的其他部分冲突。但考虑到你想做的事,我会这样做:

import pandas as pd
from Pre_Processing_File import pre_Processing

def naming():
    df = pre_Processing()
    df.to_excel('The filename you want to use.xlsx')
    
    
naming()
预处理文件:

## Import Libraries
import pandas as pd
import numpy as np
from pandas import DataFrame # Note that this is not really conventional...
from tkinter import *
  
# import filedialog module
from tkinter import filedialog

def pre_Processing():
    # Ask user for the dir1 and dir2 (what are you doing with dir2?)
    dir1 =  filedialog.askopenfile(mode="r", initialdir="/", title="select file",
                                       filetypes=(("text files", "*.txt"), ("all files", "*.*")))
    dir2 = filedialog.askopenfile(mode="rb", initialdir="/", title="Select the second file",
                                       filetypes=(("Excel files", "*.xlsx"), ("all files", "*.*")))        
    ## Read in the single long column, and then form a group indicator by seeing where the value is '[User]'. Then separate the 
    ## column labels and values, with a str.split and join back to your DataFrame. Finally pivot to your desired shape.
    
    userListing_DF = pd.read_csv(dir1, sep='\n', header=None)

    userListing_DF['Group'] = userListing_DF[0].eq('[User]').cumsum()
    userListing_DF = userListing_DF[userListing_DF[0].ne('[User]')]  # No longer need these rows

    userListing_DF = pd.concat([userListing_DF, userListing_DF[0].str.split('=', expand=True).rename(columns={0: 'col', 1: 'val'})],
                               axis=1)

    userListing_DF = userListing_DF.pivot(index='Group', columns='col', values='val').rename_axis(columns=None)
            
    return userListing_DF 

如果在代码的另一部分中需要
dir1
dir2
,我可能会在
Pre_Processing_File
中创建一个不同的函数,您可以在其中运行GUI,并询问
dir1
dir2
的目录名,然后
返回到主脚本以供进一步使用…

尝试将预处理文件底部的代码移动到您的命名函数中:

import pandas as pd

def naming():
    import Pre_Processing_File
    from Pre_Processing_File import pre_Processing
    
    dir1 =  filedialog.askopenfile(mode="r", initialdir="/", title="select file",
                       filetypes=(("text files", "*.txt"), ("all files", "*.*")))

    dir2 = filedialog.askopenfile(mode="rb", initialdir="/", title="Select the second file",
                       filetypes=(("Excel files", "*.xlsx"), ("all files", "*.*")))

    DormantAcc = pre_Processing(dir1,dir2)
    # then to_excel here or whatever else you want to do
    
naming()

预处理的作用是什么?你能让它返回一个df吗?@doctorlove它接收一个txt文件并进行一些文件操作,创建一个名为“df”的df。现在,我想将此df调用到naming.py文件中,并将其导出为excel文件add
将df
返回到函数末尾,并像调用
df=pre_Processing()
(或使用任何所需参数)一样调用它,然后在function@doctorlove非常感谢。我有进展了。还有一个问题,因为我犯了一个错误。在pre_Processing函数中,我有两个参数pre_Processing(dir1,dir2)。当我得到一个错误,说dir没有定义时,我怎么称呼他们呢。谢谢代码?因为很难猜测-错误在哪里-在这里,在哪里调用它或在预处理函数中?非常感谢@nielshenkens。我得到了以下错误:where AttributeError:“function”object没有“to_excel”属性。如果没有看到您的代码,很难猜测,但听起来好像您将df设置为函数,而不是调用它yes,因为如果我尝试执行userListing_df.head()当我调用函数时,它不起作用,那么可能是在
pre\u Processing()
的某个地方,您(错误地)将
userListing\u DF
转换为函数而不是数据帧。在调用
df.to_excel(…)
之前,在
naming()中打印
df的类型,它将不会是熊猫数据框…当我键入userListing_df.dtypes时,它也不会返回任何东西运气也不好,我之前已经尝试过了。错误是NameError:名称“dir1”未定义在哪一行(哪个文件)?预处理文件的第135行-预处理(dir1,dir2)我看不到您的所有代码-但我建议将
dir1=
dir2=
以及对函数的调用移动到命名文件中。听起来你可能把它们忘在后面了?我已经把它们移到了命名文件中,并从预处理文件中删除了它们,但我仍然得到了错误。我认为问题在于,当我在预处理文件中定义函数时,我仍然有dir1和dir2,如果我从中删除它们,那么这行userListing\u DF=pd.read\u csv(dir1,sep='\n',header=None)上也会出现错误
import pandas as pd

def naming():
    import Pre_Processing_File
    from Pre_Processing_File import pre_Processing
    
    dir1 =  filedialog.askopenfile(mode="r", initialdir="/", title="select file",
                       filetypes=(("text files", "*.txt"), ("all files", "*.*")))

    dir2 = filedialog.askopenfile(mode="rb", initialdir="/", title="Select the second file",
                       filetypes=(("Excel files", "*.xlsx"), ("all files", "*.*")))

    DormantAcc = pre_Processing(dir1,dir2)
    # then to_excel here or whatever else you want to do
    
naming()