3

txt ファイルからランダムな URL を要求するスクリプトを作成しようとしています。

import urllib2

with open('urls.txt') as urls:
    for url in urls:
        try:
            r = urllib2.urlopen(url)
        except urllib2.URLError as e:
            r = e
        if r.code in (200, 401):
            print '[{}]: '.format(url), "Up!"

404 not foundしかし、一部の url が を示している場合、URL を含む行がファイルから消去されるようにしたいと考えています。1 行に 1 つの一意の URL があるため、基本的には を返すすべての URL (およびそれに対応する行) を消去することが目標です404 not found。どうすればこれを達成できますか?

4

2 に答える 2

2

機能したすべての URL を単純に保存し、それらをファイルに書き直すことができます。

good_urls = []
with open('urls.txt') as urls:
    for url in urls:
        try:
            r = urllib2.urlopen(url)
        except urllib2.URLError as e:
            r = e
        if r.code in (200, 401):
            print '[{}]: '.format(url), "Up!"
            good_urls.append(url)
with open('urls.txt', 'w') as urls:
    urls.write("".join(good_urls))
于 2013-01-24T01:15:29.387 に答える
1

最も簡単な方法は、すべての行を読み取り、保存された行をループして開いてみることです。完了したら、失敗した 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 が追跡されるので、詳細なメッセージを追加するために書き直します。これはデバッグに役立ちます。また、実際にこのバージョンをテストしたところ、うまくいきました。

于 2013-01-24T01:15:17.500 に答える