これは@user665637の良い答えに基づいています。
#!/usr/bin/python
import re, sys
pat_incomplete = re.compile(r'\\\s*$')
pat_indented = re.compile(r'^\t')
try:
_, fname_in, fname_out = sys.argv
except ValueError:
print("Usage: python line_joiner.py <input_filename> <output_filename>")
sys.exit(1)
with open(fname_in) as in_f, open(fname_out, "w") as out_f:
lines = iter(in_f)
try:
line = next(lines)
s = pat_incomplete.sub('', line)
except StopIteration:
print("Input file did not contain any data")
sys.exit(2)
for line in lines:
line = pat_incomplete.sub('', line)
if pat_indented.match(line):
s += pat_indented.sub('',line)
else:
out_f.write(s)
s = line
out_f.write(s)
変更点:
読みやすい正規表現には「生の文字列」を使用します。
コマンドライン引数から出力ファイル名を取得し、そのファイルに書き込みます。ユーザーが間違った数の引数を指定した場合、メッセージを出力して終了します。引数を取得するために解凍するときは、気にしない部分にsys.argv
変数名を使用するという規則を使用します。_
行末を削除しないため、出力ファイルには入力ファイルと同じ種類の行末があります。(行を結合するときは、もちろん、行末を削除して結合を行います。)
入力から空白行を除外しません。少し注意が必要ですが、イテレータを作成して呼び出すnext()
ことにより、ループを開始する前に最初の入力行を取得します。したがってs
、ではなく有効な値で開始し、None
印刷するかどうかを確認するために毎回テストする必要はありません。削除された入力行に対する元のテストでは、の初期値からif lastLine:
保護するだけでなく、入力から空白行を除外します。None
lastLine
これをPython3.0またはPython2.6で使用する必要がある場合、 2つの呼び出しを行うwith
ステートメントを作成することはできません。open()
ただし、それを2つのネストされたwith
ステートメントに変換することができ、それぞれが1つのを実行しopen()
ます。