替换两个csv文件中的值

时间:2016-05-16 11:24:33

标签: python csv

我有一个小问题,希望你能够帮助我:)我已经尝试提供简化的例子来帮助你了解我的意思。我使用的是python 2.6。

因此,我目前正在尝试在文件中重新分配一些值,这些值表示两个对象之间的交互。交互文件(file1)如下所示:

 Process p = new Process();
            p.StartInfo.FileName = "python";
            p.StartInfo.Arguments = @"C:\Users\xxx\xxx\xxx\xxx_\xxx yyy\zzz.py " + path;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.Start();

            StreamReader sr = p.StandardOutput;
            p.WaitForExit();
            string result = sr.ReadToEnd();
            sr.Close();

            textBox1.Text = result;

虽然我的其他文件(file2),也是Thing1 Thing2 0.625 Thing2 Thing3 0.191 Thing1 Thing3 0.173 ,看起来像是:

tsv

基本上,我想要DiffName1 Thing1 ... DiffName2 Thing2 ... DiffName3 Thing3 ... ,在file2中找到相应的file1值,并使用与file1相同的布局创建一个新文件,但使用' Thing1&# 39;替换为' DiffName1'等等,同时保持'DiffName'的结构。即两列具有相应的交互值。

到目前为止,通过在这里提问和阅读答案,我已经用这个脚本取得了类似的结果:(我已经检查了,但这里可能有一些冗余/错误的东西)

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

有人能给我一些建议吗?

干杯,

马修

3 个答案:

答案 0 :(得分:0)

在该行ids[cols[7]] = cols[0]中只是一个拼写错误,您的示例中似乎只有2列,并且您正在尝试使用第7列。

它的作用是,您声明一个字典并从第二个文件填充它。然后,当您使用get ids.get(cols[0], cols[0])在字典中搜索时,它将搜索键cols[0],如果它不在字典中,它将返回get函数的第二个参数,在这种情况下{{1}本身。

答案 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

答案 2 :(得分:0)

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