Python - 如何读取多个文件,处理和写入多个文件

时间:2017-05-03 06:12:29

标签: python-3.x

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

以下是我在代码中尝试做的事情:

我有2个文件:

  1. main.py ,我打开多个文件并拨打我的班级&方法
  2. SoftPlag 中的
  3. pyscp.py ,其中代码是为处理输入文件而编写的。
  4. main.py

    from SoftPlag import *
    import os
    
    inputdir = "/path/to/input/directory"
    outputdir = "/path/to/output/directory"
    filelist = os.listdir(inputdir)
    
    if __name__ == '__main__':   
        for i in filelist:
            with open(inputdir + i, 'r') as f:
                fin = f.read()
                if i.endswith(".py"):
                    scp=Pyscp()    
                    scp.pscpp(fin)
                    f.flush()       
                f.close() 
    

    pyscp.py

      

    这是处理内容的文件。每个文件后   处理后,相应的输出将被写入其中的文件中   输出目录

    import re
    import keyword
    import os
    
    inputdir = "/path/to/input/directory"
    outputdir = "/path/to/output/directory"
    filelist = os.listdir(inputdir)
    frequency={}
    class Pyscp():
    #Python source-code processing class
        def pscpp(self,fin):
            #remove special characters from string and convert to lower-case 
            char_string=re.sub('[^a-zA-Z._]', ' ', fin).lower()
    
            #remove single occurrences of characters 
            final_string=re.sub(r'(?:^| )\w(?:$| )', '', char_string).strip() 
    
            reservedWords={} #empty list to store the reserved keywords
            reservedWords=keyword.kwlist #reserved keywords assigned to reservedWords list
    
            for word in reservedWords:
                #checking if reserved keyword exists in string or not 
                if word in final_string:
                    #substitute reserved keywords with no spaces
                    final_string=re.sub(r'\b' + word +r'\b', '', final_string)
    
                else:
                    continue
    
            for i in filelist:
                file_output = open(os.path.join(outputdir + i +".out"), 'w')
                file_output.write(final_string)
                file_output.close()
    

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

    请帮忙!

2 个答案:

答案 0 :(得分:0)

您无需在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'属性打开它们,它们会被覆盖,只留下外部循环的最后一次迭代的输出,即filelist中的最后一个文件。

我建议删除pyscp.py中的循环,然后执行return final_string。在main.py中,您可以将其写入文件。

关于main.py的另外三条评论:

  1. 我很惊讶你没有找到"文件未找到"错误open(inputdir + i, 'r'),因为您缺少路径分隔符。 open(os.path.join(inputdir + i), 'r')将是前往这里的方式。

  2. 通常您不需要f.flush(),因为f.close()会照顾您。您也没有在输入文件中写入任何数据。

  3. 此外,您不需要f.close(),因为with声明需要您处理。

答案 1 :(得分:0)

我想将以下代码块从'pyscp.py'文件中的函数'pscpp()'移动到'main.py'并在函数'pscpp(self,fin)'中返回变量final_string。

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()