比较三个tsv文件以检查类似项,并更新原始文件中的差异



所以我有三个.tsv文件,即file1.tsvfile2.tsvfile3.tsv,它们如下:

file1.tsv=

ID       Name
1        Abby
2        Lisa
3        
4        John
5              
6        Kevin
7        Joe
8        Sasha
9        Stuart
10       Amy

file2.tsv=

ID       Name
8        Sasha
3        Iris
9        Stuart

file3.tsv=

ID       Name
10       Amy
5        Kelly
6        Kevin
7        Joe

我需要将第一个文件解析为ID和Names,并检查条目ID中有空名称的行。然后我必须在file2.tsv中检查那些特定的ID,如果该ID有匹配的名称,我必须用它更新file1.tsv。如果我在file2.tsv中找不到所有空ID的匹配,我将不得不在file3.tsv中检查它们,这将导致ID和名称的所有适当匹配,这需要在file1.tsv中再次更新。

output.tsv文件应具有显示其相应名称的所有ID,如下所示:

ID       Name
1        Abby
2        Lisa
3        Iris
4        John
5        Kelly      
6        Kevin
7        Joe
8        Sasha
9        Stuart
10       Amy

现在,这是我尝试过的:

import csv
import sys
f1 = open("file1.tsv")
read_tsv = csv.reader(f1, delimiter="t", quotechar='"')
with open('new.tsv', 'w', newline='') as g_output: #to save the empty entry IDs in a separate file
tsv_new = csv.writer(g_output, delimiter='t')
for row in read_tsv:
if row[1] == '':            
print(row)
tsv_new.writerow(row)
g_output.close()
f1.close()
entry_ID = input('Enter ID number to find:n')
f2 = csv.reader(open('file2.tsv'), delimiter="t")
with open('output.tsv', 'a', newline='') as f_output: #to append the output to this new file
tsv_output = csv.writer(f_output, delimiter='t')
for row in f2:
if entry_ID == row[0]:
print(row)
tsv_output.writerow(row)
f_output.close()
f2.close()

同样,检查file3.tsv。然而,它似乎不起作用,而且我不想手动查找条目ID,而是希望通过操作文件处理和使用循环来自动化该过程。我是Python的新手,这似乎很棘手

这是一个例子,因为我原来的三个.tsv文件很大,手动更新ID是不可行的。

字典是您的最佳选择,因为键是唯一的,您可以读取中的每一行,并将键分配为ID。显然,以后读入的文件将覆盖任何现有的相同密钥。其次,您可以跳过任何空行或不包含名称的行:

import csv
data = {}
for filename in ['file1.tsv', 'file2.tsv', 'file3.tsv']:
with open(filename, newline='') as f_input:
csv_input = csv.reader(f_input, delimiter='t')
header = next(csv_input)

for row in csv_input:
if len(row) == 2 and row[1]:
data[int(row[0])] = row[1]      # convert the ID to an int to ensure it is numerically sorted

with open('output.tsv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output, delimiter='t')
csv_output.writerow(header)
csv_output.writerows(sorted(data.items()))

这将为您提供一个包含以下内容的输出文件:

ID  Name
1   Abby
2   Lisa
4   John
5   Kelly
6   Kevin
7   Joe
8   Sasha
9   Stuart
10  Amy

data也可用于查找ID:

>> print(data[9])
>> Stuart

相关内容

  • 没有找到相关文章

最新更新