2014-01-02 22 views
1

Допустим, у меня есть словарь, содержащий имена файлов и fullnames из 3 текстовых файлов, все такое же количество линий, Н.возвратные линии нескольких файлов итеративно

dof = {'myf1':'/a/b/myf1.txt', 'myf2':'/a/b/myf2.txt', 'myf3':'/a/b/myf3.txt'} 

Что бы быть наиболее эффективный/вещий способ перебора всех файлов, каждую строку следующим образом:

line 1 of file 1, then line 1 of file 2, then line 1 of file 3; 
line 2 of file 1, then line 2 of file 2, then line 2 of file 3; 
... 
line N of file 1, then line N of file 2, then line N of file 3; 

общее решение для любого количества файлов в словаре и любое количество общих линий было бы предпочтительнее.

+0

Что за файл? Лексический порядок ключей dict? (нет гарантии по порядку элементов в dict на python, насколько я помню, поэтому вы должны уточнить, что именно означает «файл 1». –

+0

@AndreHolzner хорошая точка, цифры могли бы быть буквально буквами, порядок – Dnaiel

ответ

4

Использование zip() перебрать линии в тройках:

for line1, line2, line3 in zip(openfile1, openfile2, openfile3): 

Вы можете производить открытый файл ручку с:

files = [open(dof[name]) for name in sorted(dof)] 

for lines in zip(*files): 

где lines является кортежем строк, следующая строка каждого входных файлов.

Если входные файлы, не не имеют одинаковое количество строк, вы можете использовать itertools.izip_longest() вместо того, чтобы обеспечить значение замены для этих линий отсутствует (используйте itertools.zip_longest() в Python 3).

+0

Что произойдет, если не все файлы имеют одинаковое количество строк? –

+0

@AndreHolzner: тогда лишние строки игнорируются. –

+0

@Martijn Pieters, выглядит как отличное предложение, так же как короткое следование как сделать его общим для словаря, который у меня есть, и любого количества файлов? – Dnaiel

Смежные вопросы