Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从每个文件中一次用2行或更多连续行交错多个文件_Python - Fatal编程技术网

Python 从每个文件中一次用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

我在下面搜索并找到了可以将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):
        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非常感谢。你的密码像冠军一样有效。祝您有个美好的一天!