问这个问题是为了让我可以在我公司的电脑上制作一个基于Python 3.7的工具(所以安装一个新模块可能不是一个选项)。更别提我最近才开始学习Python…
运行测试程序(由公司构建)后,我可以提取如下所示的txt文件
Test_1 FAIL
Test_1 FAIL
Test_1 FAIL
Test_1 PASS
Test_2 PASS
Test_3 PASS
Test_4 FAIL
Test_4 FAIL
我的目标是删除重复的行,这样剩下的就像这样
Test_1 PASS
Test_2 PASS
Test_3 PASS
Test_4 FAIL
目前,我的计划是比较每行的第一个单词与它后面的行(所以第一次迭代的Test_1 vs Test_1)。如果相同,则第一行将被丢弃。
比较的部分如下所示(假设final_file是另一个.txt文件)
with open("resultFile.txt", "r") as result_file:
lines = result_file.readlines()
for i,j in enumerate(lines[:-1]):
if j.split(" ",1)[0] == lines[i+1].split(" ",1)[0]:
del lines[i]
final_file.write(lines[i+1])
else:
final_file.write(lines[i])
我试着运行这个,我有IndexError:列表索引超出范围的if行。中方对此有何建议或评论?
谢谢你的帮助。
问题出在del lines[i]
。您正在删除一行,因此lines
的大小发生了变化。这将导致索引错误。
试试这段代码:
result = []
with open("resultFile.txt", "r") as result_file:
for line in result_file:
if line not in result:
result.append(line)
来自澄清注释:
我喜欢保留最后一次发生:例如,我的Test_1最终是PASS,所以我想保留这个,我的Tets_4仍然是FAIL,所以我保留Test_4 FAIL在这里。
假设这里的测试是按顺序/as组执行的,即测试1总是失败,直到它最终通过,然后执行到下一个测试,所以不可能有像1 2 1这样的顺序,那么这将是保持最后一个测试结果的最有效方法:
last = None
with open('resultFile.txt') as f:
for line in f: # read the file line by line, no need to read everything into memory
key = line.split(None, 1)[0] # value used to decide uniqueness
if last is not None and last[0] != key:
# we encountered a different test which also isn't the first
print(last[1]) # output last remembered line
last = key, line # remember the current line and key
if last is not None:
print(last[1]) # don't forget to output the very last line
请注意,在UNIX工具的传统中,我在这里只是简单地print
将stdout;您可能希望也可能不希望显式地写入某个文件。此外,如果您的输入文件实际上包含空行,您可能需要在那里添加一个检入并跳过它们。
尝试以下方法删除重复项:
def remove_duplications(input_lines: List[str]) -> List[str]:
unique_lines = []
for line in input_lines:
if line not in unique_lines:
unique_lines.append(line)
return unique_lines
然后试试这个
with open("resultFile.txt", "r") as result_file:
lines_to_save = remove_duplications(result_file.readlines())
with open("output_file.txt", "w") as final_file:
final_file.writelines(lines_to_save)
如果它们相同,则可以使用set来删除重复项。
with open("resultFile.txt", "r") as result_file:
lines = list(set(result_file.readlines()))
set()
删除重复项,但返回生成器,因此使用list()
转换该生成器小心,set不保持顺序。
如果你想保持秩序,你可以
with open("resultFile.txt", "r") as result_file:
unique_lines = [line for line in result_file if line not in unique_lines]