2017-04-11 169 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!']

然而,这不是一个很好的做法,留下打开的文件这样的方式。

相关问题