我正在尝试用Python构建源代码抄袭检测工具。我试图从输入目录中存在的多个python程序文件中获取输入,执行一些处理并将输出写入多个文件。
以下是我在代码中尝试做的事情:
我有2个文件:
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()
这是处理内容的文件。每个文件后 处理后,相应的输出将被写入其中的文件中 输出目录
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包打开多个文件并对它们进行处理,但它不能正确写入多个文件。即它是多次写入第一个文件的输出数据而不是写入不同的输出数据。
请帮忙!
答案 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
的另外三条评论:
我很惊讶你没有找到"文件未找到"错误open(inputdir + i, 'r')
,因为您缺少路径分隔符。 open(os.path.join(inputdir + i), 'r')
将是前往这里的方式。
通常您不需要f.flush()
,因为f.close()
会照顾您。您也没有在输入文件中写入任何数据。
此外,您不需要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()