所以我有三个.tsv
文件,即file1.tsv
、file2.tsv
和file3.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