最も簡単な方法は、すべての行を読み取り、保存された行をループして開いてみることです。完了したら、失敗した URL がある場合はファイルを書き直します。
ファイルを書き換える方法は、新しいファイルを書き込み、新しいファイルが正常に書き込まれて閉じられたらos.rename()
、新しいファイルの名前を古いファイルの名前に変更して、古いファイルを上書きすることです。これが安全な方法です。新しいファイルが正しく書き込まれたことがわかるまで、正常なファイルを上書きすることはありません。
これを行う最も簡単な方法は、適切な URL を集めたリストを作成し、失敗した URL の数を数えることだと思います。カウントがゼロでない場合は、テキスト ファイルを書き直す必要があります。または、別のリストに不正な URL を収集することもできます。このサンプルコードでそれを行いました。(私はこのコードをテストしていませんが、動作するはずです。)
import os
import urllib2
input_file = "urls.txt"
debug = True
good_urls = []
bad_urls = []
bad, good = range(2)
def track(url, good_flag, code):
if good_flag == good:
good_str = "good"
elif good_flag == bad:
good_str = "bad"
else:
good_str = "ERROR! (" + repr(good) + ")"
if debug:
print("DEBUG: %s: '%s' code %s" % (good_str, url, repr(code)))
if good_flag == good:
good_urls.append(url)
else:
bad_urls.append(url)
with open(input_file) as f:
for line in f:
url = line.strip()
try:
r = urllib2.urlopen(url)
if r.code in (200, 401):
print '[{0}]: '.format(url), "Up!"
if r.code == 404:
# URL is bad if it is missing (code 404)
track(url, bad, r.code)
else:
# any code other than 404, assume URL is good
track(url, good, r.code)
except urllib2.URLError as e:
track(url, bad, "exception!")
# if any URLs were bad, rewrite the input file to remove them.
if bad_urls:
# simple way to get a filename for temp file: append ".tmp" to filename
temp_file = input_file + ".tmp"
with open(temp_file, "w") as f:
for url in good_urls:
f.write(url + '\n')
# if we reach this point, temp file is good. Remove old input file
os.remove(input_file) # only needed for Windows
os.rename(temp_file, input_file) # replace original input file with temp file
編集: コメントで、@abarnert は、os.rename()
Windows での使用に問題がある可能性があることを示唆しています (少なくとも、それが彼/彼女の意味だと思います)。うまくいかない場合は、代わりos.rename()
に使用できるはずです。shutil.move()
編集: エラーを処理するためにコードを書き直します。
編集: URL が追跡されるので、詳細なメッセージを追加するために書き直します。これはデバッグに役立ちます。また、実際にこのバージョンをテストしたところ、うまくいきました。