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)