Текстовый файл на самом деле не имеет двух измерений (ширины и высоты), как это может показаться при просмотре в текстовом редакторе.На самом деле он имеет только одно измерение.
Например, этот файл:
first line
second line
third line
содержит строку с двумя символами новой строки (\n
):
'first line\nsecond line\nthird line'
Теперь давайте объединим это с другим файлом, который имеет следующее содержимое:
blue
cheese
(или: 'blue\ncheese'
)
Обычный способ, который вы называете вертикальным, просто суммирует строки:
'first line\nsecond line\nthird lineblue\ncheese'
То, что вы хотите, является чем-то более сложным, то есть объединить каждую строку (и, возможно, также добавить некоторый интервал):
'первая строка синяя \ nс вторая строка сыр \ nthird line'
Делать это непосредственно на уровне двух больших строк невозможно, поэтому вы хотите:
- разбить каждый файл на список строк (например,
['first line', 'second line', 'third line']
и ['blue', 'cheese']
) - объединить каждую строку первого файла с соответствующей строкой второго файла (например,
'first line' + ' ' + 'blue'
) - позаботиться о лишних строках, поскольку один файл может быть длиннее (например,
'third line' + ''
) - объединить строки
Вот как это сделать, шаг за шагом:
Чтобы прочитать файл как lНапример, вы можете сделать f.read().splitlines()
, но лучше f.readlines()
или просто перебрать файловый объект (for line in f: ...
)
Чтобы сопоставить соответствующие строки двух файлов, вы можете использовать zip_longest
:
for left_line, right_line in zip_longest(left_lines, right_lines):
...
Для конкатенации с отступом: '{} {}'. Format (left_line, right_line)
Все вместе, многословно:
left_lines = []
with open(left_filename, 'rt') as left_file:
for line in left_file:
line_without_newline = line.strip('\n')
left_lines.append(line_without_newline)
right_lines = []
with open(right_filename, 'rt') as right_file:
for line in right_file:
line_without_newline = line.strip('\n')
right_lines.append(line_without_newline)
merged_lines = []
for left_line, right_line in zip_longest(left_lines, right_lines, fillvalue=''):
merged_lines.append('{} {}'.format(left_line, right_line))
with open(output_filename, 'wt') as output_file:
for merged_line in merged_lines:
output_file.write(merged_line + '\n')
Теперь выможно пропустить большинство промежуточных шагов, чтобы сделать его проще:)
with open(left_filename, 'rt') as left_file,\
open(right_filename, 'rt') as right_file,\
open(output_filename, 'wt') as output_file:
for left_line, right_line in zip_longest(left_file, right_file, fillvalue=''):
output_file.write('{} {}\n'.format(left_line.strip('\n'),
right_line.strip('\n')))