2017-04-11 126 views
0

我是python的新手,只開始使用文件。我想知道如何使用列表理解將兩個文件的數據組合成一個列表來讀取和組合它們。將兩個文件的數據合併到一個列表中

#for instance line 1 of galaxies = I 
#line 1 of cycles = 0 
#output = [IO] (list) 

這是我到目前爲止。提前致謝!

comlist =[line in open('galaxies.txt') and line in open('cycles.txt')] 

更新:

comlist = [mylist.append(gline[i]+cline[i]) for i in range(r)] 

然而,這僅僅是返回無

+2

爲什麼列表理解?在列表解析中使用文件或其他I/O似乎不是一個好主意 –

+0

同意。你可以使用'comlist = open('galaxies.txt')。readlines()+ open('cycles.txt')。readlines()' – TessellatingHeckler

+0

使用上下文管理器和'with'語句會更好 –

回答

1
+0

因此組合而不是追加。 –

+1

對不起,我應該讓自己更清楚。來自兩個文件的數據是按照原始文件的順序追加的。 –

+0

沒關係@SheilaEvans,我不想讓你有額外的需求。至少現在你知道'zip'結合了,如果你還沒有。 –

2

結合就像這樣:

#from itertools import chain 

def chainer(*iterables): 
    # chain('ABC', 'DEF') --> A B C D E F 
    for it in iterables: 
     for element in it: 
      yield element 

comlist = list(chainer(open('galaxies.txt'), open('cycles.txt'))) 
print(comlist) 

儘管像這樣打開文件通常不被認爲是一種好的做法。

+0

不幸的是,我們不允許導入不是由導師指導的功能。我欣賞幫助。 –

+0

@Sheila:在[documentation](https://docs.python.org/3/library/itertools.html#itertools.chain)中有一個配方。 – martineau

0

如果它只有2個文件,你爲什麼要一起使用理解?這樣的事情會更容易:

[l for l in open('galaxies.txt')]+[l for l in open('cycles.txt')] 

的問題是,如果你有n文件?讓我們在列表中說... fileList = ['f1.txt', 'f2.txt', ... , 'fn.txt']。然後,你可以考慮itertools.chain

import itertools as it 
filePointers = map(open, fileList) 
lines = it.chain(filePointers) 
map(close, filePointers) 

我沒有測試過,但是這個應該工作...

+0

謝謝!顯示我實際上需要在提交答案之前正確地閱讀代碼... – ssm

0
f1 = open('galaxies.txt') 
f2 = open('cycles.txt') 

如果你想通過交替的線把它們結合在一起,使用zip和理解:

comlist = [line for two_lines in zip(f1, f2) for line in two_lines] 

您需要兩次迭代,因爲zip的返回值本身就是一個迭代,在這種情況下,它由兩行組成,一行來自f1,另一行來自f2。如圖所示,您可以在一次理解中結合兩次迭代。

如果你想在其他以後結合他們一個,用「+」進行連結:

comlist = [line for line in f1] + [line for line in f2] 

在這兩種情況下,這是一個很好的做法,關閉每個文件:

f1.close() 
f2.close() 
0

使用只有列表內涵:

[line for file in (open('galaxies.txt'), open('cycles.txt')) for line in file] 

然而,它是不好的做法,留下的文件打開並希望GC清理它起來。如果你想要去除的行字符的好辦法是line.rstrip('\r\n')年底

import fileinput 
with fileinput.input(files=('galaxies.txt', 'cycles.txt')) as f: 
    comlist = f.readlines() 

:你真的應該做這樣的事情。

+0

我欣賞這個建議。當我使用這種方法時,我得到/ n個字符在我的列表中。有沒有辦法擺脫這些,同時仍然使用單行列表理解? –

+0

我加了一條關於如何做到這一點的評論。如果你知道列表解析是如何工作的,你就會知道把它放在哪裏;) –

0

可以實現內lambdamap你的任務:

我承擔in_file(第一檔)中的數據是這樣的:

1 2 
3 4 
5 6 
7 8 

而且在in_file2(第二檔)中的數據是這樣的:

hello there! 

而隨着這段代碼:

# file 1 
a = "in_file" 
# file 2 
b = "in_file2" 
f = lambda x,y: (open(x, 'r'),open(y, 'r')) 
# replacing "\n" with an empty string 
data = [k for k in map(lambda x:x.read().replace("\n",""), f(a,b))] 
print(data) 

輸出將是:

['1 23 45 67 8', 'hello there!']

然而,這不是一個很好的做法,留下打開的文件這樣的方式。

相關問題