2012-09-19 138 views
1

我正在嘗試從n個文件中讀取行。然後我將打印出所有數據到一個文件。棘手的是,我不知道該目錄包含多少個文件,我想將它打印出來,所以每個文件都有它自己的列。 例子:(文本是一些數據,我不關心,可以使用拆分搶[1])從n個文件打印列表(列表)列爲n列

File 1 contains: 
text Line1 
text Line2 
text Line3 

文件2包含:

text Line01 
text Line02 
text Line03 

我想結合到一個文件像這樣:

File 1 File 2 
Line1 Line01 
Line2 Line02 
Line3 Line03 

一個問題我有是,當我讀的文件,我在一次讀取一個文件,並追加每行一個列表,但後來我怎麼把它打印出來我想要的方式。

fromfiles = ['Line1','Line2','Line3','Line01','Line02','Line03'] 

fromfiles2 = [['Line1','Line2','Line3'],['Line01','Line02','Line03']] 

如果formfiles:我如何打印出一號線和line01在同一時間,然後繼續?

如果formfiles2:與上面相同的問題確實如此。我需要同時訪問多個元素,而無需知道列表中有多少項,然後打印出所有內容。

如果有人能幫我解決這個問題,我將不勝感激。

+0

同時打開這兩個文件並將每一行寫出來? – Aesthete

+0

所以我應該同時打開n個文件?如果你問我,聽起來不太好。 – Kleazy

+0

@Kleazy:你看過我的回答嗎?這不是一個「聽起來不錯」的問題。只是一個需求問題。考慮你的輸入文件是每個1 GB,你有10個:你仍然可以按照你想要的方式處理它們,但是你必須**逐行處理它們,否則你會運行RAM。但是,我認爲您的輸入文件不是很大,而且內存中的解決方案完全沒問題。 –

回答

2

zip()是爲此而製作的!讓我們從你的fromfiles2開始:

>>> fromfiles2 = [['Line1','Line2','Line3'],['Line01','Line02','Line03']] 
>>> outputlines = zip(*fromfiles2) 
>>> for l in outputlines: 
...  print "\t".join(l) 
... 
Line1 Line01 
Line2 Line02 
Line3 Line03 

這是怎麼zip作品基本上是:

>>> l1 = [1, 2, 3] 
>>> l2 = ['a', 'b', 'c'] 
>>> zip(l1, l2) 
[(1, 'a'), (2, 'b'), (3, 'c')] 

當然,這也適用於兩個以上參數:-)。

當文件很小時,這是一個很好的方法。然後,您可以先安全地將它們讀入內存,將數據合併到內存中,然後將合併的數據寫入輸出文件。但是,如果您的輸入非常大(GB數據),則應該同時讀取輸入文件,構建輸出行,將其寫入文件,然後才能繼續輸入文件中的下一行。

如果你得到了zip的概念,那麼你可以看看itertools.izip爲使事情更內存效率:

>>> from itertools import izip 
>>> for l in izip(*fromfiles2): 
...  print "\t".join(l) 
... 
Line1 Line01 
Line2 Line02 
Line3 Line03 

另外,如果你的文件不具有相同數量的輸入文件,你可能想在itertools.izip_longest看看:

>>> fromfiles3 = [['Line1','Line2','Line3'],['Line01','Line02']] 
>>> for l in izip_longest(*fromfiles3, fillvalue="Nothing"): 
...  print "\t".join(l) 
... 
Line1 Line01 
Line2 Line02 
Line3 Nothing 
+0

謝謝,這解決了我的問題。我使用文件2和zip,然後我只需要打印出來。 – Kleazy

-3

將它保存爲fromfiles2 ...列表清單。

然後檢查最大行數(所有列表中最大的.count())。

然後做一個for循環從0到<<maximum number of lines -1>>這樣的(僞代碼):

for(int i = 0; i < maxNumOfLines; i++) { 
    String lineToPrint = ""; 
    for(int j = 0; j < numberOfLists; j++) { 
    lineToPrint += listOfLists[j][i]; 
    } 
    File.Write(lineToPrint); 
} 

注意:您要檢查索引[J] [I]存在,因爲這些文件將不長度相同。

+3

python比僞代碼更僞代碼。 – rantanplan

+0

我會改變它到更多的僞代碼,如果它是亞親愛的。 –

+0

PAH擰它...我認爲我可以得到我的意思是我的蟒蛇僞代碼。 –

0

當你閱讀每個文件,不斷髮現的最大行數(可能使用LEN()),你在一個文件中遇到。

使用第二種解決方案,並遍歷每個行號1到全局最大值。如果該文件存在行條目,則將其打印出來;否則,跳過它。

# loop through files 
# max = number of lines max 

for i in range(max): 
    line = [] 
    for file in fromfiles2: 
    if len(file) > i: 
     line.append(file[i]) 
    else: 
     line.append('') 
    # print your line here