こういうプログラムというのは、一見簡単そう見えるのですが、何を1行と見なすかによって、アルゴリズムやコードが全然違うものにしなければなりませんので、結構難しいです。
hanachan.さんの行の定義は、改行で区切られたファイルの各部分なので、readlinesで返ってくる行の数とは違っています。
出力の方も、一番最後に改行が入ると、hanachan.さんの行の定義に合わないので最後の行だけ特別扱うが必要になります。
readlineは、EOFに達すると空文字列''を返すため、最後の空白行との区別を付けるのが難しくなります。readでファイル全体を読み込み、'\n'でsplitするのが、hanachan.さんが期待する行の定義を実現するには適しているでしょう。
ファイルが巨大でなければ、まずデータを作るという方法が確実ですのでそういうコードを書いてみました。
python
1import sys
2
3if len(sys.argv) != 3:
4 print('error') #ここはちゃん場合分けしてメッセージを出しましょう。
5 exit(-1)
6
7fileA = sys.argv[1]
8fileB = sys.argv[2]
9fileOUT = 'output.txt'
10
11try:
12 with open(fileA, 'r') as fA:
13 listA = fA.read().split('\n')
14except FileNotFoundError:
15 print('error {fileA}') #ここはちゃんメッセージを書き換えましょう。
16 exit(-1)
17
18try:
19 with open(fileB, 'r') as fB:
20 listB = fB.read().split('\n')
21except FileNotFoundError:
22 print('error {fileB}') #ここはちゃんメッセージを書き換えましょう。
23 exit(-1)
24
25maxlen = max(len(listA), len(listB))
26if len(listA) < maxlen:
27 listA.extend(['']*(maxlen - len(listA)))
28elif len(listB) < maxlen:
29 listB.extend(['']*(maxlen - len(listB)))
30else:
31 pass
32
33try:
34 with open(fileOUT, 'w') as fOUT:
35 for i in range(maxlen - 1):
36 fOUT.write(f'{listA[i]}\n{listB[i]}\n\n')
37 fOUT.write(f'{listA[maxlen - 1]}\n{listB[maxlen - 1]}')
38except Exception:
39 print('error {fileOUT}') #ここはちゃんメッセージを書き換えましょう。
40 exit(-1)
本当は、
python
1
2if __name __ == '__main__':
を使って書くべきなのですが、初心者ということで何もかも一度に変更すると混乱するかもしれないので止めておきました。
これだけの変更でも大変だとは思いますが、動かしてみてください。