首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查多个tsv文件,并删除python中每个tsv中的所有相同行。

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

Stack Overflow用户
提问于 2021-03-09 09:41:33
回答 1查看 122关注 0票数 1

我有三个tsv文件。

档案1:

代码语言:javascript
复制
1   Alice   24      
10  Bill    23
4   Ellen   24
9   Mike    30

档案2:

代码语言:javascript
复制
6  Julie   76
2  Bob     42
7  Tom     54
5  Frank   30
1  Alice   24

档案3:

代码语言:javascript
复制
3  Dave    68
8  Jerry   34
1  Alice   24
5  Frank   30
2  Bob     42

输出:我的期望输出是从任何那些tsv文件中删除第一列和第二列的值相同的所有行,并保持其他行的原样。

档案1:

代码语言:javascript
复制
10  Bill    23
9   Mike    30
4   Ellen   24

档案2:

代码语言:javascript
复制
6  Julie   76
7  Tom     54

档案3:

代码语言:javascript
复制
3  Dave    68
8  Jerry   34

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

代码语言:javascript
复制
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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-10 09:03:37

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

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

在读取所有内容之后,现在可以使用counts来确定是否只看到过一次给定的行,可以跳过其他值。

代码语言:javascript
复制
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' +,这是为了将输出文件写入稍微不同的文件名,以避免在测试时覆盖原始文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66544388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档