使用Python 3.7,如何在.txt文件中删除具有相同开头的行?



问这个问题是为了让我可以在我公司的电脑上制作一个基于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]

最新更新