2016-12-12 7 views
2

私は、オンラインで掲示されたログファイルから情報を取り出し、出力を読み込もうとしています。本当に必要な唯一の情報は、ファイルの最後に掲載されています。これらのファイルは非常に大きく、ソケット出力全体を変数に格納して読み込み、内部メモリを大量に消費しています。ソケットを下から上に読んでいたのですか?PythonでURLソケットを後方に読む

socket = urllib.urlopen(urlString) 
OUTPUT = socket.read() 
socket.close() 
OUTPUT = OUTPUT.split("\n") 
for line in OUTPUT: 
    if "xxxx" in line: 
     print line 

私は、Python 2.7を使用しています:私は現在持っている何

。私はSocketの出力の最後から約30行を読みたいと思っています。

答えて

2

このユースケースでは、HTTP Rangeリクエストが必要です。私は明確にすべき

http://stuff-things.net/2015/05/13/web-scale-http-tail/

:ここで私が配置チュートリアルですその後、レンジ要求を行って、HEADリクエストでサイズを得ることの利点は、あなたがすべてのコンテンツを転送する必要がないことです。あなたは非常に大きなファイルのリソースを持って言及したので、これは最善の解決策:)

編集になるだろう:以下のコードを追加しました...ここで

が、そのブログ記事のデモ(簡体字)ですが、 Pythonに翻訳されています。これはすべてのHTTPサーバーでは機能しませんのでご注意ください!より多くのコメントをインライン:

正しい答えであるように思わ
""" 
illustration of how to 'tail' a file using http. this will not work on all 
webservers! if you need an http server to test with you can try the 
rangehttpserver module: 

$ pip install requests 
$ pip install rangehttpserver 
$ python -m RangeHTTPServer 
""" 
import requests 

TAIL_SIZE = 1024 

url = 'http://localhost:8000/lorem-ipsum.txt' 
response = requests.head(url) 

# not all servers return content-length in head, for some reason 
assert 'content-length' in response.headers, 'Content length unknown- out of luck!' 

# check the the resource length and construct a request header for that range 
full_length = int(response.headers['content-length']) 
assert full_length > TAIL_SIZE 
headers = { 
    'range': 'bytes={}-{}'.format(full_length - TAIL_SIZE, full_length) 
} 

# Make a get request, with the range header 
response = requests.get(url, headers=headers) 
assert 'accept-ranges' in response.headers, 'Accept-ranges response header missing' 
assert response.headers['accept-ranges'] == 'bytes' 
assert len(response.text) == TAIL_SIZE 

# Otherwise you get the entire file 
response = requests.get(url) 
assert len(response.text) == full_length 
+1

、しかし、あなたがコピーしてください/リンクのみの答えは(今までのリンク腐朽のことを聞いた)/ downvotedフラグを付ける傾向があるため、作業スニペットを作成します。 –

+0

BTW私はこれらのことについて全く専門家ではありませんが、そのような要求を受け入れないウェブサイトはありません(99%のgrrrrrであっても、すべてのダウンロードをやり直す必要があるサイトなどの古いサイト:) )? –

+0

@ Jean-FrançoisFabreポインタをありがとう!この例をPythonコードに変換しようとします。 (どの言語がとにかくですか?)私はかなりHTTP HeadリクエストとRangeヘッダーがかなり標準的で、かなり普遍的でなければならないと確信しています。しかし、私はhttpサーバにも権限がありません。 –

関連する問題