1

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!"
        elif r.code == 404:
            print '[{}]: '.format(url), "Not Found!" 

しかし、いくつかのURLが404が見つからないときにファイルから消去したいのです。各 URL は 1 行ごとなので、基本的には 404 が見つからないすべての URL を消去することです。どうやってするの?!

4

2 に答える 2

1

2 番目のファイルに書き込むことができます。

import urllib2

with open('urls.txt', 'r') as urls, open('urls2.txt', 'w') as urls2:
    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!"
            urls2.write(url + '\n')
        elif r.code == 404:
            print '[{}]: '.format(url), "Not Found!" 
于 2013-01-24T03:53:50.353 に答える
0

ファイルから行を削除するには、ファイルの内容全体を書き直す必要があります。これを行う最も安全な方法は、同じディレクトリに新しいrenameファイルを書き込んでから、古いファイルに上書きすることです。コードを次のように変更します。

import os
import sys
import tempfile
import urllib2

good_urls = set()

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):
            sys.stdout.write('[{}]: Up!\n'.format(url))
            good_urls.add(url)
        elif r.code == 404:
            sys.stdout.write('[{}]: Not found!\n'.format(url))
        else:
            sys.stdout.write('[{}]: Unexpected response code {}\n'.format(url, r.code))

tmp = None
try:
    tmp = tempfile.NamedTemporaryFile(mode='w', suffix='.txt', dir='.', delete=False)
    for url in sorted(good_urls):
        tmp.write(url + "\n")
    tmp.close()
    os.rename(tmp.name, 'urls.txt')
    tmp = None
finally:
    if tmp is not None:
        os.unlink(tmp.name)

good_urls.add(url)最初のループのelse句にa を追加することができます。最後に try-finally で行ったことをより適切に行う方法を誰かが知っている場合は、それについて聞きたいです。

于 2013-01-24T04:01:08.280 に答える