2017-07-31 121 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