0

数千の Web リクエストを作成していますが、すべてを一度に完了することはできません。の場合はおそらくtryandを使用して、自分の位置を保存するにはどうすればよいですか? エラーが発生したときに5分間、または何かを使用して、中断したところから続行したいと思います。中断したところから続行する方法がわかりません。リストを作成してから要素をポップすることを検討しましたが、それは面倒です。助言がありますか?excepturllib2.HTTPError: HTTP Error 400: Bad Requesttime.sleep

ここに私のコードの肉があります:

with open('csvlist.csv', 'rb') as data:
    reader = csv.reader(data)
    for row in reader:
        retrieveAdd(row[0])

WhereretrieveAddは Web リクエストを作成し、データベースにデータを追加します。100リクエストごとにスリープしようとしましたが(下記)、うまくいきませんでした。

with open('csvlist.csv', 'rb') as data:
    reader = csv.reader(data)
    count = 0
    for row in reader:
        retrieveAdd(row[0])
        count += 1
        if count % 100 == 0:
            time.sleep(180)
4

2 に答える 2

2

ファイル オブジェクトとcsv.readerオブジェクトは一緒に既に位置を追跡しているため、そのwithステートメント内のどこかで例外を処理するだけで、もう一度ループすることができ、for row in reader:中断したところから再開されます。

本当にばかげた例の場合:

with open('csvlist.csv', 'rb') as data:
    reader = csv.reader(data)
    ireader = enumerate(reader)
    try:
        for i, row in ireader:
            print('Read row #{}'.format(i))
            if i == 10:
                raise ValueError("I don't like the 10th row")
    except Exception as e:
        print('Raised {}'.format(e))
    for i, row in ireader:
        print('Read row #{}'.format(i))

(明らかでない場合:コメントでEricが指摘したcsv.readerように、ファイルが再開可能で、そのファイルにラップされたファイルが再開可能である場合、そのファイルにenumerateラップされたものもそうです。)csv.reader


もちろん、ループ内で例外を処理できる場合は、forこれも必要ありません。

with open('csvlist.csv', 'rb') as data:
    reader = csv.reader(data)
    for i, row in enumerate(reader):
        try:
            print('Read row #{}'.format(i))
            if i == 10:
                raise ValueError("I don't like the 10th row")
        except Exception as e:
            print('Raised {}'.format(e))

あなたの場合、それができない理由がわかりません。


より高いレベルで例外を処理する必要がある場合、保証された唯一の安全な解決策は、何行あったかを覚えておき、その数の行をスキップすることですが、tellandseekメソッドを使用すると、私がアクセスできるすべての Python で機能し、おそらくcsvモジュールの合理的な実装で安全であること。したがって、ループを通過するたびに、data.tell()でアクセスできる変数をスタッシュしてからexcept、ファイルを再度開いてdata.seek(stash)、 を再作成できますreader。(stashテキストファイル/ピクル/データベース/何でも入れることができるので、プロセスを終了して、中断したところから再開できます。)

于 2013-10-23T21:08:03.660 に答える
1

「5分後に再試行」操作を関数でラップしてみませんか?

def retrieveAddSafe(data, repeat=5):
    """ Attempts to retrieve `data`, swallowing HTTPErrors `repeat` times before
    throwing"""
    for _ in xrange(repeat - 1):
        try:
            return retrieveAdd(data)
        except urllib2.HTTPError:
            time.sleep(5 * 60)

    # if it fails after `repeat` times, allow the error to be raised
    return retrieveAdd(data)

with open('csvlist.csv', 'rb') as data:
    reader = csv.reader(data)
    for count, row in enumerate(reader):
        retrieveAddSafe(row[0])
于 2013-10-23T21:11:15.427 に答える