2017-07-31 120 views
0

我有一个TSV(制表符分隔的文件),其中一个标题被称为session_id。我也有一个名为myMap的地图,其中密钥是session_id,值是会话长度。现在我想要修改tsv文件,以便在最后添加一个名为“Length”的标题并在其中添加长度值。这意味着对于每一行,我应该将session_length作为另一个制表符分隔值附加到每行的末尾。 例如,如果我的TSV文件的第一行是这样的,首先:将一列添加到TSV文件的末尾

User_id Session_id Age Date 
23  'adasd5' 23 23/02/2017 

而且我也有:

myMap['adasd5']=12 

因此,该文件应更改为:

User_id Session_id Age Date  Length 
23  'adasd5' 23 23/02/2017 12 

这里是我做的,但它不工作:

with open('file.tsv', 'r+b') as infile: 
     header=infile.next() 
     h=header+'\t'+"return"+'\n' 
     infile.write(h) 
     for line in infile: 
      line2 = line.strip().split('\t') 
      if line2[1] in myMap: 
       d=line+'\t'+str(myMap[line2[1]])+'\n' 
      infile.write(d) 
    infile.close() 
+0

愿意用熊猫吗? –

+0

此外,你尝试过什么方式不起作用? –

+0

@RyanStout是的。如果你有解决方案,我也可以使用熊猫。 – HimanAB

回答

1

我问一个朋友(@Babak)找到了答案。

下面是答案:

df=pd.read_csv('file.tsv', sep='\t',names=["User_id","Session_id","Age","Date"]) 

df['Length']=df.session_id.apply(lambda x:myMap[x]) 
0

虽然熊猫会让这一切变得轻而易举,但好的Python可以做到这一点。你在tsv输入文件中的Session_id值附近有单引号,所以output.append代码行有一个.replace()方法来摆脱他们的字典查找。

否则,你只是在文件中加载,指定tab作为分隔符,跳过标题行,并将文件的其余部分摄入列表。

然后您遍历此列表,将myMap查找的结果附加到结尾。输出新的标题并将输出数据写入文件。

import csv 
with open('file.tsv', newline='') as f: 
    f.readline() 
    reader = csv.reader(f, delimiter='\t') 
    data = list(reader) 

output = [] 
myMap = { 
    'adasd5': 12, 
} 
for line in data: 
    user_id, session_id, age, date = line 
    output.append([user_id, session_id, age, date, myMap[session_id.replace("'", '')]]) 

with open('output.tsv', 'w', newline='') as f: 
    headers = ['User_id', 'Session_id', 'Age', 'Date', 'Length'] 
    writer = csv.writer(f, delimiter='\t') 
    writer.writerow(headers) 
    writer.writerows(output) 
+0

你能否也提供熊猫的答案? – HimanAB

+0

为什么不先给它一个镜头,让我们知道你想出了什么。同样,如果第一个例子有效,为什么不把它作为正确的解决方案来接受并接受呢? – Chris

+0

当然。我正在测试它。一旦有效就会接受答案。 – HimanAB