微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查多个tsv文件并从python中的每个tsv中删除所有相同的行

如何解决检查多个tsv文件并从python中的每个tsv中删除所有相同的行

我有三个 tsv 文件

文件 1:

1   Alice   24      
10  Bill    23
4   Ellen   24
9   Mike    30

文件 2:


6  Julie   76
2  Bob     42
7  Tom     54
5  Frank   30
1  Alice   24

文件 3:

3  Dave    68
8  Jerry   34
1  Alice   24
5  Frank   30
2  Bob     42

输出: 我希望的输出是从任何这些 tsv 文件删除第一列和第二列的值相同的所有行,并保持其他行不变。

文件 1:

10  Bill    23
9   Mike    30
4   Ellen   24

文件 2:

6  Julie   76
7  Tom     54

文件 3:

3  Dave    68
8  Jerry   34

我的 tsv 文件是无头的。到目前为止,我已经尝试过以下代码

with open('file2.tsv') as check_file:
    check_set = set([row.split('\t')[0].strip().upper() for row in check_file])

with open('file1.tsv','r') as in_file,open('file3.tsv','w') as out_file:
    for line in in_file:
        if line.split('\t')[0].strip().upper() in check_set:
            out_file.write(line)

但是我没有用这段代码得到我想要的三个输出文件。任何帮助将不胜感激。提前致谢。

解决方法

您首先需要读取所有 TSV 文件并计算前两列的每次出现次数。 Python 的 Counter() 可用于此目的(基于字典)。

在读取每一行时,将其保存在 data 字典中,其中键是文件名,内容是前两个值的列表以及原始行。 defaultdict() 用于避免在追加新条目之前添加不存在的条目。

读完所有内容后,现在可以使用 counts 来确定任何给定的行是否只见过一次,其他值可以跳过。

from collections import Counter,defaultdict

counts = Counter()      # hold counts of each first two value pairs
data = defaultdict(list)  # hold all data from all files

for tsv in ['file1.tsv','file2.tsv','file3.tsv']:
    with open(tsv) as f_tsv:
        for row in f_tsv:
            split = list(map(str.strip,row.split('\t')))
            key = tuple(split[:2])  # first and second column values
            counts[key] += 1
            data[tsv].append((key,row))

for tsv,key_rows in data.items():
    with open('x' + tsv,'w') as f_tsv:
        for key,row in key_rows:
            if counts[key] == 1:
                f_tsv.write(row)

我建议您添加 print() 语句以更好地理解每个变量的含义,例如print(counts)print(data)

注意:准备好后取出'x' +,这是为了将输出文件写入稍微不同的文件名以避免在测试时覆盖原始文件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。