2016-05-16 81 views
-1

我有一个小问题,我希望你能帮助我:)我试图提供简化的例子来帮助你明白我的意思。我正在使用Python 2.6。替换两个csv文件的值

所以,我目前正试图重新分配表示两个对象之间交互的文件中的一些值。交互文件(文件1)看起来是这样的:

Thing1 Thing2 0.625 
Thing2 Thing3 0.191 
Thing1 Thing3 0.173 

虽然我的其他文件(文件2),也tsv,看起来像:

DiffName1 Thing1 ... 
DiffName2 Thing2 ... 
DiffName3 Thing3 ... 

从本质上讲,我想借此file1 ,在file2中找到对应的​​值,并创建一个与file1具有相同布局的新文件,但将'Thing1'替换为'DiffName1'等等,同时保持file1的结构。即具有相应交互值的两列。

到目前为止,从提出问题和阅读的答案在这里,我已经取得了类似的结果与此脚本:(我检查了,但有可能在这里的一些冗余/错误的事情)

import csv 
import sys 

interaction_file = sys.argv[1] 
Out_file = sys.argv[2] 
f_output = open(Out_file, 'wb') 

ids = {}    

with open('file2') as f_file2: 
    csv_file2 = csv.reader(f_file2, skipinitialspace=True) 
    header = next(csv_file2) 

    for cols in csv_file2: 
     ids[cols[7]] = cols[0] 

with open(interaction_file, 'rb') as f_file1:  
    csv_file1 = csv.reader(f_file1, delimiter='\t')  
    csv_output = csv.writer(f_output, delimiter='\t') 

    for cols in csv_file1:    
     csv_output.writerow([ids.get(cols[0], cols[0]), ids.get(cols[1], cols[1]), cols[2]]) 

但是无论出于何种原因,我怀疑由于file2的布局略有不同,与此脚本最初编写的文件相比,我一直无法为我工作。我花了很多时间相当多的试图理解这个文件的每一行,但我仍然不能完全得到它运行,可能是因为我不太完全理解最后一行:

csv_output.writerow([ids.get(cols[0], cols[0]), ids.get(cols[1], cols[1]), cols[2]]) 

是谁能给我一些建议吗?

干杯,

马修

+0

你有使用熊猫的自由吗?如果是这样,请尝试使用熊猫加入或str.replace功能, – pmaniyan

+0

它究竟如何不适合你? –

+0

我只是在问,如果你有使用熊猫的自由。 – pmaniyan

回答

0

是该行ids[cols[7]] = cols[0]只是一个错字,你似乎有在你的例子只有2列,你要使用7列。

它的作用是,你声明一个字典并从第二个文件填充它。然后,当您在字典中搜索得到ids.get(cols[0], cols[0])时,它将搜索关键字cols[0],如果它不在字典中,它将返回get函数的第二个参数,在此例中为cols[0]本身。

+0

是的,这是一个错字,我的道歉。这是从我有类似的任务,但想要在我的文件2的位置7的值,并将其更改为位于字典的位置1。至少这是我对这条线的理解。 –

0

我给你的脚本添加了一些注释,并改变/缩短了一些位。 docs on dict.get应该可以帮助您了解最后一行:

import csv, sys 

interaction_file, out_file = sys.argv[1], sys.argv[2] 
f_output = open(out_file, 'wb')   

with open('file2') as f_file2: 
    # get lines as list and slice off header row 
    rows = list(csv.reader(f_file2, skipinitialspace=True, delimiter='\t'))[1:] 

    # ids: Thing* as key, DiffName* as value 
    ids = {row[1]: row[0] for row in rows} 

with open(interaction_file, 'rb') as f_file1:  
    csv_file1 = csv.reader(f_file1, delimiter='\t')  
    csv_output = csv.writer(f_output, delimiter='\t') 

    for row in csv_file1: 
     csv_output.writerow([ids.get(row[0], row[0]), ids.get(row[1], row[1]), row[2]]) 
     # ids.get(row[0], row[0]): dict.get(key[, default]) 
     # use value (DiffName*) for key row[0] (Thing*) from ids, 
     # or use row[0] (Thing*) itself 
     # if it is not present as a key in ids 
+0

非常感谢您的帮助,您的评论肯定帮助我更好地理解。 但是,这个脚本不会改变我的文件。我在最后一行的索引位置发生了变化,试图了解发生了什么问题,但没有任何影响输出。 (输出看起来与交互文件相同) –

+0

那么,你应该在那里放一些调试'print'语句来查看正在处理的实际行,键和值。否则难以从远处诊断) – schwobaseggl

+0

'为行中的行: \t \t IDS = {行[1]:行[0]} \t \t打印ids' 产生表示'名称的字典:DiffName “如预期。我不明白的是,如果我在最后一行更改索引位置,怎么会在我的输出结果中没有显示。 –

0

检查您的输入文件是否有正确的分隔符。而且看到错误信息会很好。