如何解决检查多个tsv文件并从python中的每个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 举报,一经查实,本站将立刻删除。