Python 从每个文件中一次用2行或更多连续行交错多个文件
我在下面搜索并找到了可以将2个文件逐行插入新文件的代码Python 从每个文件中一次用2行或更多连续行交错多个文件,python,Python,我在下面搜索并找到了可以将2个文件逐行插入新文件的代码 from itertools import izip_longest from contextlib import nested with nested(open('foo'), open('bar')) as (foo, bar): for line in (line for pair in izip_longest(foo, bar) for line in pair if line
from itertools import izip_longest
from contextlib import nested
with nested(open('foo'), open('bar')) as (foo, bar):
for line in (line for pair in izip_longest(foo, bar)
for line in pair if line):
print line.strip()
我有多个文件,喜欢有2个或更多的连续行交错一个接一个。我喜欢能够根据工作选择行数。每个文件中的总行数可能不相同,但所有文件中每个元素的行数模式始终相同。我怎样才能实现我的目标
input:
fileA
lineA1
lineA2
lineA3
......
fileB
lineB1
lineB2
lineB3
......
For 2 lines output:
lineA1
lineA2
lineB1
lineB2
.....
For 3 lines output:
lineA1
lineA2
lineA3
lineB1
lineB2
lineB3
....
多谢各位
@谢天谢地。你的密码像冠军一样有效。祝你今天愉快 这应该有效:
from itertools import islice
# number of sequential lines to read from each file
N = 2
# files that are read
files = [open(n) for n in ['foo', 'bar', 'baz']]
line = ''.join([''.join(islice(f, N)) for f in files])[:-1]
while line:
print(line)
line = ''.join([''.join(islice(f, N)) for f in files])[:-1]
[f.close() for f in files]
--在这里,文件是在列表理解中手动打开和关闭的,而不是使用和嵌套的或ExitStack
;当调用文件上的islice
时,从文件中读取前N行(当读取这些行时,它们不再位于文件对象中——它们会弹出)(此外,还可以使用[line for line in file]
循环文件)''。join
将给定列表/元组/iterable对象的项连接到一个字符串中,并使用''
作为分隔符;由于print
向打印的字符串添加换行符,[:-1]
将从文件中删除结果字符串的最后一个字符,即换行符
如果仅读取2个文件,则使用读取即可:
from itertools import islice
# number of sequential lines to read from each file
N = 2
with open('foo') as foo, open('bar') as bar:
line = ''.join(islice(foo, N)) + ''.join(islice(bar, N))[:-1]
while line:
print(line)
line = ''.join(islice(foo, N)) + ''.join(islice(bar, N))[:-1]
关于所用材料的一些参考资料:
关闭文件始终是一个好主意。即使它们在当前版本的特定python解释器上关闭,也绝对不能保证它们会出现在下一个版本中。事实上,在这种情况下,Jython和Pypy都不会自动关闭文件。@spectras,是的。但同时,嵌套的已被弃用。显然是一个。。因此,如果目标是任何python解释器(Jython/Pypy),可能需要列出文件列表,循环遍历它们,并在最后手动关闭它们。虽然在这里,由于您在循环行之前读取所有文件,您可以一个接一个地打开它们,不需要嵌套或stackexit。要使用xealits,请将代码更改为从每个文件中交错2行或更多连续行。刚刚编辑了我的帖子以澄清。谢谢你的帮助。@xealits非常感谢。你的密码像冠军一样有效。祝您有个美好的一天!