我有一个小问题,希望你能够帮助我:)我已经尝试提供简化的例子来帮助你了解我的意思。我使用的是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
有人能给我一些建议吗?
干杯,
马修
答案 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)
检查输入文件是否具有正确的分隔符。并且看到错误信息也会很好。