<p>在文本编辑器中查看文本文件时,文本文件实际上没有两个维度(宽度和高度)。它实际上只有一个维度。你知道吗</p>
<p>例如,此文件:</p>
<pre><code>first line
second line
third line
</code></pre>
<p>实际上包含一个包含两个换行符(<code>\n</code>)的字符串:</p>
<pre><code>'first line\nsecond line\nthird line'
</code></pre>
<p>现在,让我们将其与另一个包含以下内容的文件合并:</p>
<pre><code>blue
cheese
</code></pre>
<p>(或:<code>'blue\ncheese'</code>)</p>
<p>通常的方法,你称之为垂直,简单地对字符串求和:</p>
<pre><code>'first line\nsecond line\nthird lineblue\ncheese'
</code></pre>
<p>您需要的是更复杂的内容,即合并每一行(也可能添加一些间距):</p>
<p>'第一行蓝色\n第二行\n第三行'</p>
<p>直接在两个大字符串的级别上执行此操作是不可能的,因此您需要:</p>
<ul>
<li>将每个文件拆分为行列表(例如<code>['first line', 'second line', 'third line']</code>和<code>['blue', 'cheese']</code>)</li>
<li>将第一个文件的每一行与第二个文件的相应行合并(例如<code>'first line' + ' ' + 'blue'</code>)</li>
<li>注意多余的行,因为一个文件可能更长(例如<code>'third line' + ''</code>)</li>
<li>合并线条</li>
</ul>
<p>下面是如何一步一步地做到这一点:</p>
<p>要以行的形式读取文件,可以执行<code>f.read().splitlines()</code>,但最好是<code>f.readlines()</code>或只是迭代文件对象(<code>for line in f: ...</code>)</p>
<p>要匹配两个文件的对应行,可以使用<code>zip_longest</code>:</p>
<pre><code>for left_line, right_line in zip_longest(left_lines, right_lines):
...
</code></pre>
<p>要串联,请使用填充:
'{}{}'。格式(左\行,右\行)</p>
<p>总之,冗长:</p>
<pre><code>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')
</code></pre>
<p>现在,您可以跳过大部分中间步骤以使其更简单:)</p>
<pre><code>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')))
</code></pre>