2015-01-16 66 views
2

假設我有兩個文本文件,其內容如下所示。Python並排合併逗號分隔文本文件

文本文件1:

Apple, 0 
Pear, 1 
Orange, 0 

文本文件2:

Apple, 1 
Pear, 1 
Orange, 1 

我想將它們合併在一個並排側時尚,僅保留左「列「,它對於文本文件1的兩個文本文件都是相同的。也就是說,我希望產生下面的合併文本文件。

合併的文本文件:

Apple, 0, 1 
Pear, 1, 1 
Orange, 0, 1 

我試圖找到如何在---代碼相當少量---執行這樣的合併。但是,在真正的問題中,可以有任何數量的文本文件。我怎樣才能在Python中做到這一點?

假設:

  1. 每個文本文件都將具有完全相同的行數。
  2. 每個文本文件都是以逗號分隔的文件,每行只有一個逗號。
  3. 對於每個文本文件中的每一行,逗號左側的值都完全相同。

回答

1

fileinput.in認沽將採取列表文件,使用ordereddict到Concat的所有值和維持秩序:

from collections import OrderedDict 
d= OrderedDict() 

import fileinput 
with open("joined.txt","w") as f: 
    for line in fileinput.input(["file1.txt","file2.txt","file3.txt","file4.txt"]): 
     spl = line.strip().split(",") 
     d.setdefault(spl[0],[]) 
     d[spl[0]] += spl[1:] 
    for k,v in d.items(): 
     f.write("{} {}\n".format(k,",".join(v))) 

如果他們都在自己的目錄,你可以通過os.listdir到的FileInput:

from collections import OrderedDict 
d= OrderedDict() 

import fileinput 
import os 

with open("joined.txt","w") as f: 
    for line in fileinput.input(os.listdir("path_to")): 
     spl = line.strip().split(",") 
     d.setdefault(spl[0],[]) 
     d[spl[0]] += spl[1:] 
    for k,v in d.items(): 
     f.write("{} {}\n".format(k,",".join(v))) 

如果它們不是唯一的文件,但遵循一個模式,你可以使用glob:

import fileinput 
import os 
import glob 

with open("joined.txt","w") as f: 
    for line in fileinput.input(glob.glob("./file*.txt")): 
     spl = line.strip().split(",") 
     d.setdefault(spl[0],[]) 
     d[spl[0]] += spl[1:] 
    for k,v in d.items(): 
     f.write("{} {}\n".format(k,",".join(v))) 
1

我會zip然後同時穿過它們。做一些分裂和格式化,然後寫了一個新的文件作爲你去行由行

with open('text1.csv') as f1, open('text2.csv') as f2, open('merge.csv', 'w') as fOut: 
    for line1, line2 in zip(f1, f2): 
     name, val1 = line1.strip().split(',') 
     val2 = line2.strip().split(',')[1] 
     fOut.write('{}, {}, {}\n'.format(name, val1, val2)) 
+2

擴展到任意數量的文件有點棘手。 –

+0

@ScottHunter確實如此。如果沒有別的,麻煩。考慮到OP的使用案例,首先想到的就是這些。 – CoryKramer

2

嘗試csvkit,它有一個命令行實用程序也可能是更容易使用:

第一安裝有:

pip install csvkit 

然後:

csvjoin --outer file1.csv file2.csv