我一直在努力完成这项任务,我真的想学习如何使用Python来完成这项任务。我想采用两个制表符分隔的文件,一个只有ID,另一个具有相同的ID和一些描述。我可以使用unix join轻松地将共享ID字段上的这些文件合并,但为此我需要对两者进行排序,并且我希望保留第一个文件的顺序。
我已经尝试了下面的一些代码,我的方法是尝试将元素添加到元组中,从我的理解中,他们会在添加时保持顺序。我没有能够得到任何工作。有人可以帮忙吗?
示例文件:
file1 ->
111889
1437390
123
27998
2525778
12
1345
file2 ->
2525778'\t'item778
1345'\t'item110
123'\t'item1000
12'\t'item8889
111889'\t'item1111
1437390'\t'item222
27998'\t'item12
output ->
111889'\t'item1111
1437390'\t'item222
123'\t'item1000
27998'\t'item12
2525778'\t'item778
12'\t'item8889
1345'\t'item110
这是我到目前为止所做的:
import sys
add_list = ()
with open(sys.argv[1], 'rb') as file1, open(sys.argv[2], 'rb') as file2:
for line2 in file2:
f1, f2, f3 = line2.split('\t')
#print f1, f2, f3
for row in file1:
#print row
if row != f1:
break
else:
add_list.append(f1,f2,'\n')
break
答案 0 :(得分:3)
关键是使用Python 词典,它们非常适合这项任务......
这是一个完整的答案:
import sys
# Each id is mapped to its item name
# (split() splits at whitespaces (including tabulation and newline), with no empty output strings):
items = dict(line.split() for line in open(sys.argv[2])) # Inspired by mgilson's answer
with open(sys.argv[1]) as ids:
for line in ids:
id = line.rstrip() # newline removed
print '{}\t{}'.format(id, items[id])
结果如下:
% python out.py file1.txt file2.txt
111889 item1111
1437390 item222
123 item1000
27998 item12
2525778 item778
12 item8889
1345 item110
PS:请注意,我没有以rb
模式打开文件,因为这里不需要保留原始换行字节,因为我们摆脱了尾随换行符。
答案 1 :(得分:1)
我会创建一个字典,将ID映射到第二个文件中的字段值:
with open('file2') as fin:
d = dict(x.split(None, 1) for x in fin)
然后我将使用第一个文件按字典顺序构造输出:
with open('file1') as fin, open('output', 'w') as fout:
for line in fin:
key = line.strip()
fout.write('{key}\t{value}\n'.format(key=key, value=d[key])
答案 2 :(得分:0)
out = {}
with open(sys.argv[1], 'rb') as file1, open(sys.argv[2], 'rb') as file2:
d2 = {}
for line in file2:
(key, val) = line.split('\t')
d2[key] = val
lines = file1.readlines()
out = { x:d2[x] for x in lines }
我不确定你的排序依据。