我有三个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)但是我没有得到我想要的三个输出文件。任何帮助都将不胜感激。提前谢谢。
发布于 2021-03-10 09:03:37
您首先需要读取所有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' +,这是为了将输出文件写入稍微不同的文件名,以避免在测试时覆盖原始文件。
https://stackoverflow.com/questions/66544388
复制相似问题