2016-01-22 3 views
2

У меня есть список файлов ['file_a.txt', 'file_b.txt', 'file_c.txt' ....]прочитанной строки из нескольких файлов питона

Я хочу, чтобы прочитать одну строку из каждого файла и создать новую строку, добавив их вместе.

Вывод должен выглядеть следующим образом:

file_a_line_1 file_b_line_1 file_c_line_1.... 
file_a_line_2 file_b_line_2 file_c_line_2.... 

Может zip использоваться, чтобы сделать это?

+0

Да, zip - это путь для этого. Что вы хотите сделать, если файлы не имеют одинаковой длины? – L3viathan

+0

Я не могу найти примеры использования zip с несколькими файлами (более 2), если они не имеют одинаковой длины, я бы хотел, чтобы они добавляли строки из тех, которые все еще существуют в том же порядке. – Rahul

+0

Ах, я нашел способ заполнить его, я думаю. Обновление моего ответа. – L3viathan

ответ

2
from itertools import zip_longest 

files = [open(filename) for filename in file_list] 

for lines in zip_longest(*files, fillvalue=''): 
    print(" ".join(lines)) 

Это также должно работать, если файлы не имеют одинаковой длины. Я бы использовал izip_longest, если вы на Python 2.

Это может оставить несколько пробелов между значениями, если некоторые файлы исчерпаны, поэтому вы можете захотеть сделать более сложные вещи, чем объединение, но это более легкая часть.

+0

Я не знал про zip_longest. Потрясающие! – Rahul

+0

Ах, спасибо, исправлено. Раньше я не знал о zip_longest, но в целом полезно посмотреть в itertools для вопросов итераций и functools для вопросов функционального программирования. – L3viathan

1

Что-то вроде этого может работать. Вы откроете все файлы, затем прочитайте по одной строке за раз от каждого из них. Непонятно, что вы хотите сделать, когда один файл не имеет линий (полностью остановите), продолжайте движение до тех пор, пока все строки не останутся в строках?

file_list = ['file1', 'file2', 'file3'] 

fps = [] 
for fn in file_list: 
    fps.append(open(fn, 'w')) 
curLine = 'start' 

while curLine: 
    curLine = '' 
    for fp in fps: 
     myLine = fp.readline() 
     if myLine: 
      curLine += myLine + ' ' 
     else: 
      break #can do what you want when you run out 

for fp in fps: 
    fp.close() 

Не забудьте закрыть файлы обработчиков.

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