我是python的新手,只是开始使用文件。我想知道如何使用列表理解将两个文件的数据组合成一个列表来读取和组合它们。
roo> mongo setup
Command 'mongo setup' not found (for assistance press TAB or type "hint" then hit ENTER)
Searching 'mongo setup' on installed repositories
0 matches found with 'mongo setup' on installed repositories
这是我到目前为止所拥有的。提前谢谢!
#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')]
然而,这只是没有返回
答案 0 :(得分: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)
尽管将文件保持打开状态通常不被认为是一种好习惯。
答案 1 :(得分:1)
您可以使用zip
来组合iterables
答案 2 :(得分: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)
我还没有对它进行过测试,但这应该可行......
答案 3 :(得分: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()
答案 4 :(得分:0)
仅使用列表推导:
[line for file in (open('galaxies.txt'), open('cycles.txt')) for line in file]
然而,将文件保持打开并希望GC清理它是不好的做法。你应该真的这样做:
import fileinput
with fileinput.input(files=('galaxies.txt', 'cycles.txt')) as f:
comlist = f.readlines()
如果要删除行尾字符,请使用line.rstrip('\r\n')
。
答案 5 :(得分:0)
您可以在lambda
和map
:
我假设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!']
但是,以这种方式保留打开的文件并不是一个好习惯。