Python - добавить строку к существующим строкам файла

У меня есть исходный файл (fo.log), как показано ниже:

title1  title2  title3
o11     o12     o13
o21     o22     o23
o31     o32     o33

И файл назначения (fd.log), как показано ниже:

d11   d12
d21   d22
d31   d32

Оба файла имеют одинаковое количество строк (это могут быть миллионы строк), за исключением строки заголовка исходного файла. Думая об использовании памяти, я не хочу читать все строки в память.

После обработки моего скрипта я хотел бы получить файл назначения (fd.log), как показано ниже:

d11   d12   o13
d21   d22   o23
d31   d32   o33

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

Соответствие между строками из одного файла в другой - это просто позиция строки, и информация о ней не имеет ничего общего.

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

from pathlib import Path

file_from = Path("path-to-origin-file/fo.log").open()
file_to = Path("path-to-destination-file/fd.log").open()

# create an enumerator to iterate over origin file lines
eft = enumerate(file_to)

# skip the first line with titles
next(eft)

for line_counter,line_to in eft:
    print(' '.join([
                line_to.rstrip('\n'), 
                file_from.readline().split()[2]]))

file_from.close()
file_to.close()

3 ответа

Для достаточно маленьких файлов вы можете подготовить содержимое файла в виде списка или строки, а затем записать его в файл, например:

from pathlib import Path

with Path('in-file').open() as in_file, Path('out-file').open('r+') as out_file:
    lines = []

    for line1, line2 in zip(in_file.readlines()[1:], out_file.readlines()):
        line = '{}   {}\n'.format(line2.rstrip(), line1.split()[-1])
        lines.append(line)

    out_file.seek(0)  # rewind the output file to the beginning
    out_file.writelines(lines)

Для больших файлов рассмотрите использование резервного файла как stdlib fileinput модуль делает.

with open('newfile.csv' 'r+b') as f:
    for line_counter,line_to in eft:
        print(' '.join(
            [line_to.rstrip('\n'), 
            file_from.readline().split()[2]])
        )
with open('text1.txt', 'r') as istr:
    with open('text2.txt', 'r+') as ostr:
        iistr = istr.readlines()
        oostr = ostr.readlines()
        fstr = zip(iistr[1:], oostr)
        output_lines = []
        for iline, oline in fstr:
            # Get rid of the trailing newline (if any).
            output_lines.append(oline.rstrip('\n') + '  ' + iline.split()[2] + '\n')

        ostr.seek(0)
        ostr.writelines(output_lines)
Другие вопросы по тегам