将列附加到TSV文件的末尾

时间:2017-07-31 18:40:49

标签: python file csv

我有一个TSV(制表符分隔文件),其中一个标题称为session_id。我还有一个名为myMap的映射,其中键是session_id,值是会话长度。现在我想要的是修改tsv文件,以便我在末尾添加一个名为“Length”的标题,并在那里添加长度值。这意味着对于每一行,我应该将session_length作为另一个制表符分隔值附加到每行的末尾。 例如,如果我的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()

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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)