Python 3.x Python-如何读取多个文件、处理和写入多个文件

Python 3.x Python-如何读取多个文件、处理和写入多个文件,python-3.x,Python 3.x,我正在尝试用Python构建一个源代码剽窃检测工具。我试图从输入目录中的多个python程序文件中获取输入,执行一些处理工作,并将输出写入多个文件 以下是我试图在代码中执行的操作: 我有两个文件: main.py,在这里我打开多个文件并调用我的类和方法 pyscp.py来自软件包SoftPlag,其中编写的代码用于处理输入文件 main.py pyscp.py 这是处理内容所在的文件。在每个文件 处理后,相应的输出将写入其 输出目录 我所面临的问题是,我能够使用一个文件对象使用os包打开多个文件

我正在尝试用Python构建一个源代码剽窃检测工具。我试图从输入目录中的多个python程序文件中获取输入,执行一些处理工作,并将输出写入多个文件

以下是我试图在代码中执行的操作:

我有两个文件:

  • main.py,在这里我打开多个文件并调用我的类和方法
  • pyscp.py来自软件包SoftPlag,其中编写的代码用于处理输入文件
  • main.py pyscp.py 这是处理内容所在的文件。在每个文件 处理后,相应的输出将写入其 输出目录

    我所面临的问题是,我能够使用一个文件对象使用os包打开多个文件,并对它们进行处理,但不能正确地写入多个文件。它多次写入第一个文件的输出数据,而不是写入不同的输出数据


    请帮忙

    您不需要在
    pyscp.py
    中再次迭代文件。您实际上是在创建一个嵌套循环,看起来有点像这样:

    for i_main in filelist:
        # here you are reading your inputfile
        # then you do some processing
        for i_pyscp in filelist:
            # here you are writing to outputfile
    
    当然,这会将所有输入文件的所有结果写入所有输出文件。由于您使用
    'w'
    属性打开它们,它们将被覆盖,只留下外部循环的最后一次迭代的输出,即
    文件列表中的最后一个文件

    我建议删除
    pyscp.py
    中的循环,只需执行
    returnfinal\u string
    。在
    main.py
    中,您可以将其写入文件

    关于
    main.py
    的另外三条注释:

  • 我很惊讶您在
    open(inputdir+I,'r')
    中没有发现“File not found”错误,因为您缺少路径分隔符<代码>打开(os.path.join(inputdir+i),'r')
  • 将是这里的方法

  • 通常你不需要
    f.flush()
    ,因为
    f.close()
    会帮你处理。此外,您没有将任何数据写入输入文件

  • 另外,您也不需要
    f.close()
    ,因为
    with
    语句会为您处理它


  • 我猜,将下面的代码块从“pyscp.py”文件中的函数“pscpp()”移动到“main.py”并返回函数“pscpp(self,fin)”中的变量final_字符串

    处理每个文件后,pscpp()内的写入块始终覆盖所有输出文件。这可能是罪魁祸首

    if __name__ == '__main__':   
        for i in filelist:
            with open(inputdir + i, 'r') as f:
                fin = f.read()
                if i.endswith(".py"):
                    scp=Pyscp()    
                    result = scp.pscpp(fin)
    
                    file_output = open(os.path.join(outputdir + i +".out"), 'w')
                    file_output.write(result)
                    file_output.close()
    
                    f.flush()      
                f.close()
    

    可以因此,如果我将“pyscp.py”文件中的代码块放在“main.py”中并编写函数“pscpp(self,fin)”和“return(final_string)”,我的代码会工作吗?是的,我想是的。好的。我将它们写入函数的动机是,我想根据它们的特性将代码块分割成函数。我之前提到的处理只是我项目的一部分。我想尝试一下你的建议,但是有没有办法根据代码块的功能将它们分开?你可以在pscpp()函数中保留它,唯一的问题是for循环获取文件名。如果可以将其传递给函数pscpp(),则可以将其保留在那里。您的意思是说我应该在“main.py”中编写函数“pscpp(self,fin)”的代码块,正如上面@ArunKumar所建议的那样?关于你提到的三点:一,。我已经按照你的建议实施了。2 & 3. 我不得不使用f.flush(),因为我发现内存清理没有正常进行。如果我试图从file1.py和file2.py获取输入,那么它也从内存获取file1.java的输入&我得到file1.py、file1.py~、file2.py、file2.py~&file1.java~。有什么有效的内存清理方法吗?最重要的是在编写输出文件时不要使用循环。如果满足您的需要,您可以将处理部分保留在
    pyscp.py
    中。您也可以将输出文件的编写留在那里,但随后需要在函数调用中传递文件名。我的建议是将文件写入您读取它们的位置。因此,您的
    pyscp.py
    将全部用于处理,您不必担心那里的文件名和路径。这将仅限于关于额外文件的
    main.py
    :我不明白Python为什么会访问这些文件,所以我不知道内存问题是从哪里来的。以
    ~
    结尾的文件名看起来像是临时文件,因为有些编辑器创建这些文件是为了存储(和恢复)未保存的更改。但是基于您的代码,我希望Python会忽略它们。我现在已经将文件的读写放在main.py中。因此,通过这些更改,文件读取和写入工作正常。我现在的要求是需要变量'final_string',该变量存在于pyscp.py文件中。此变量存储每个文件的处理输出,并且需要写入相应的文件。“final_string”变量是否可以导入到“main.py”中,或者是否有其他解决方案?您是否询问如何从函数返回值?只需添加到
    pscpp()
    函数定义
    返回最终\u字符串的末尾即可。在
    main.py
    中,然后使用
    final\u string=scp.pscpp(fin)
    调用它。
    for i_main in filelist:
        # here you are reading your inputfile
        # then you do some processing
        for i_pyscp in filelist:
            # here you are writing to outputfile
    
    if __name__ == '__main__':   
        for i in filelist:
            with open(inputdir + i, 'r') as f:
                fin = f.read()
                if i.endswith(".py"):
                    scp=Pyscp()    
                    result = scp.pscpp(fin)
    
                    file_output = open(os.path.join(outputdir + i +".out"), 'w')
                    file_output.write(result)
                    file_output.close()
    
                    f.flush()      
                f.close()