Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换两个csv文件中的值_Python_Csv - Fatal编程技术网

Python 替换两个csv文件中的值

Python 替换两个csv文件中的值,python,csv,Python,Csv,我有一个小问题,我希望你能帮我:)我试着提供一些简单的例子来帮助你理解我的意思。我正在使用python 2.6 因此,我目前正在尝试在一个文件中重新分配一些值,该文件表示两个对象之间的交互。交互文件(file1)如下所示: Thing1 Thing2 0.625 Thing2 Thing3 0.191 Thing1 Thing3 0.173 而我的另一个文件(file2),也是一个tsv,看起来像: DiffName1 Thing1 ... DiffName2 Thing2

我有一个小问题,我希望你能帮我:)我试着提供一些简单的例子来帮助你理解我的意思。我正在使用python 2.6

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

Thing1  Thing2  0.625
Thing2  Thing3  0.191
Thing1  Thing3  0.173
而我的另一个文件(file2),也是一个
tsv
,看起来像:

DiffName1  Thing1  ...
DiffName2  Thing2  ...
DiffName3  Thing3  ...
基本上,我希望获取
file1
,在file2中找到相应的
'DiffName'
值,并创建一个与file1布局相同的新文件,但将'Thing1'替换为'DiffName1'等等,同时保持
file1
的结构。i、 e具有相应交互值的两列

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

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

csv_output.writerow([ids.get(cols[0], cols[0]), ids.get(cols[1], cols[1]), cols[2]]) 
有人能给我一些建议吗

干杯


Matthew

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


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

我在脚本中添加了一些注释,并更改/缩短了一些位。应帮助您理解最后一行:

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

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

您有使用熊猫的自由吗?如果是这样,请尝试使用pandas join或str.replace函数,它到底如何不适用于您?我只是询问,您是否有使用pandas的自由。不幸的是,我的脚本主要运行在服务器上,我没有根访问权限,因此我宁愿不使用pandasys,这是一个输入错误,我道歉。它是从我有一个类似的任务,但想在我的文件2的位置7的值,并改变它在字典的位置1留下的。至少这是我对这句话的理解。非常感谢你的帮助,你的评论确实帮助我更好地理解了这句话。但是,这个脚本不会改变我的文件。我在最后一行中改变了索引位置,试图了解出了什么问题,但没有任何东西影响输出。(输出看起来与交互文件相同)那么,您应该在其中放入一些调试
print
语句,以查看正在处理的实际行、键和值。否则很难从远处诊断;)
对于行中的行:ids={row[1]:row[0]}print ids
生成一个字典,该字典按预期表示
Name:DiffName
。我不明白的是,如果我更改最后一行中的索引位置,为什么在我的输出中没有表示出来。在最后一个循环中,
print row
的输出是什么?它打印输入文件中的行的精确副本。
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