在Python中逐个合并CSV文件

在Python中逐个合并CSV文件,python,csv,import-from-csv,Python,Csv,Import From Csv,我有一系列随机模拟的输出,以.csv文件的形式,如下所示: Run,ID,Var 1,1,7 1,2,9 1,3,4 2,1,3 2,2,4 2,3,8 等等 除此之外,我还有另一个数据文件,也是.csv,格式如下: ID, Var2, Var3 1,0.89,0.10 2,0.45,0.98 3,0.27,0.05 4,0.98,0.24 注意:数据文件中有一些值未显示在模拟文件中。我希望这些被忽略 我想做的是编写一个脚本,从第一个.csv文件中获取每个值ID,然后找到Var2和Var3并

我有一系列随机模拟的输出,以.csv文件的形式,如下所示:

Run,ID,Var
1,1,7
1,2,9
1,3,4
2,1,3
2,2,4
2,3,8
等等

除此之外,我还有另一个数据文件,也是.csv,格式如下:

ID, Var2, Var3
1,0.89,0.10
2,0.45,0.98
3,0.27,0.05
4,0.98,0.24
注意:数据文件中有一些值未显示在模拟文件中。我希望这些被忽略

我想做的是编写一个脚本,从第一个.csv文件中获取每个值ID,然后找到Var2和Var3并将其放在一起,最后得到如下结果:

Run, ID, Var, Var2, Var3
1,1,7,0.89,0.10
1,2,9,0.45,0.98
1,3,4,0.27,0.05
2,1,3,0.89,0.10
2,2,4,0.45,0.98
2,3,8,0.27,0.05
有什么建议吗?我承认这是我对Python数据处理理解的极限。我对如何在SAS中实现这一点有相当的了解,但我更愿意将其保留为一种语言任务,以便它们可以作为单个脚本进行处理。

不使用csv模块的解决方案:

输出: data3.txt包含

不使用csv模块的解决方案:

输出: data3.txt包含

输出.csv:

Run, ID, Var
1, 1, 7
1, 2, 9
1, 3, 4
2, 1, 3
2, 2, 4
2, 3, 8
data.csv:

ID, Var2, Var3
1, 0.89, 0.10
2, 0.45, 0.98
3, 0.27, 0.05
8, 0.4, 0.5
请注意,即使我们在data.csv中有条目,但在output.csv中没有条目,这也不会影响最终结果,因为在解析output.csv时,我们只查找从output.csv知道的ID,尽管相反的不是真正的data.csv至少必须包含output.csv中的所有ID,如果你需要的话,这很容易处理

代码:

现在保存回csv文件

fieldnames = ['Run', 'ID', 'Var', 'Var2', 'Var3']
f = open('combined.csv', 'wb')
csvwriter = csv.DictWriter(f, fieldnames = fieldnames)
csvwriter.writerow(dict((fn,fn) for fn in fieldnames)) # 2.7 has writeheader, which is cleaner
[csvwriter.writerow(row) for row in values]
f.close()


$ cat combined.csv 
Run,ID,Var,Var2,Var3
1,1,7,0.89,0.10
1,2,9,0.45,0.98
1,3,4,0.27,0.05
2,1,3,0.89,0.10
2,2,4,0.45,0.98
2,3,8,0.27,0.05
我希望这能有所帮助。

output.csv:

Run, ID, Var
1, 1, 7
1, 2, 9
1, 3, 4
2, 1, 3
2, 2, 4
2, 3, 8
data.csv:

ID, Var2, Var3
1, 0.89, 0.10
2, 0.45, 0.98
3, 0.27, 0.05
8, 0.4, 0.5
请注意,即使我们在data.csv中有条目,但在output.csv中没有条目,这也不会影响最终结果,因为在解析output.csv时,我们只查找从output.csv知道的ID,尽管相反的不是真正的data.csv至少必须包含output.csv中的所有ID,如果你需要的话,这很容易处理

代码:

现在保存回csv文件

fieldnames = ['Run', 'ID', 'Var', 'Var2', 'Var3']
f = open('combined.csv', 'wb')
csvwriter = csv.DictWriter(f, fieldnames = fieldnames)
csvwriter.writerow(dict((fn,fn) for fn in fieldnames)) # 2.7 has writeheader, which is cleaner
[csvwriter.writerow(row) for row in values]
f.close()


$ cat combined.csv 
Run,ID,Var,Var2,Var3
1,1,7,0.89,0.10
1,2,9,0.45,0.98
1,3,4,0.27,0.05
2,1,3,0.89,0.10
2,2,4,0.45,0.98
2,3,8,0.27,0.05
我希望这能有所帮助。

简单易行:

f = open('one.csv', 'r')
one = f.read()
f.close()

f = open('two.csv', 'r')
two = f.read()
f.close()

one = one.split('\n')[1:-1]
two = two.split('\n')[1:-1]
output = 'Run, ID, Var, Var2, Var3\n'

for o in one:
  for t in two:
    row = t.split(',')
    if o.split(',')[1] == row[0]:
      output += '%s,%s,%s\n' % (o, row[1], row[2])

# or save it to a file
print output
简单易用:

f = open('one.csv', 'r')
one = f.read()
f.close()

f = open('two.csv', 'r')
two = f.read()
f.close()

one = one.split('\n')[1:-1]
two = two.split('\n')[1:-1]
output = 'Run, ID, Var, Var2, Var3\n'

for o in one:
  for t in two:
    row = t.split(',')
    if o.split(',')[1] == row[0]:
      output += '%s,%s,%s\n' % (o, row[1], row[2])

# or save it to a file
print output

您的csv文件中的值/标题之间真的有空格吗?对不起,这是为了便于阅读。您的csv文件中的值/标题之间真的有空格吗?对不起,这是为了易读性。你的序言中的Output.csv和Data.csv是相同的-我想这是错误的?我还意识到还有一个我没有提到的复杂问题-现在编辑它。您的答案是否仍然有效?@EpiGrad注意:数据文件中有一些值未显示在模拟文件中。我希望这些被忽略。这不是一个问题,虽然它们在物理上没有被忽略,但它们仍然被输入字典中进行查找,但是由于它们的ID不在输出文件中,因此它们不会被使用。。。我已经相应地更新了测试文件…序言中的Output.csv和Data.csv是相同的-我认为这是错误的?我还意识到还有一个我没有提到的复杂问题-现在编辑它。您的答案是否仍然有效?@EpiGrad注意:数据文件中有一些值未显示在模拟文件中。我希望这些被忽略。这不是一个问题,虽然它们在物理上没有被忽略,但它们仍然被输入字典中进行查找,但是由于它们的ID不在输出文件中,因此它们不会被使用。。。我已经相应地更新了测试文件。。。