テキストファイルへのURLが与えられた場合、テキストファイルの内容を読み取る最も簡単な方法は何ですか?


113

PythonでテキストファイルのURLが指定されている場合、テキストファイルのローカルコピーを保存せずに、テキストファイルのコンテンツにアクセスし、ファイルのコンテンツを行単位でローカルに印刷する最も簡単な方法は何ですか?

TargetURL=http://www.myhost.com/SomeFile.txt
#read the file
#print first line
#print second line
#etc

回答:


114

編集09/2016:Python 3 以降では、urllib2の代わりにurllib.requestを使用します

実際、最も簡単な方法は次のとおりです。

import urllib2  # the lib that handles the url stuff

data = urllib2.urlopen(target_url) # it's a file like object and works just like a file
for line in data: # files are iterable
    print line

ウィルが提案したように、「readlines」さえも必要としません。あなたも、それを短縮することができます: *

import urllib2

for line in urllib2.urlopen(target_url):
    print line

ただし、Pythonでは読みやすさが重要であることを覚えておいてください。

ただし、これは最も簡単な方法ですが、安全な方法ではありません。ほとんどの場合、ネットワークプログラミングでは、予想されるデータ量が尊重されるかどうかがわからないためです。そのため、一般的には、固定された妥当な量のデータを読み取る方がよいでしょう。これは、期待するデータには十分であることがわかっていますが、スクリプトが溢れるのを防ぎます。

import urllib2

data = urllib2.urlopen("http://www.google.com").read(20000) # read only 20 000 chars
data = data.split("\n") # then split it into lines

for line in data:
    print line

* Python 3の2番目の例:

import urllib.request  # the lib that handles the url stuff

for line in urllib.request.urlopen(target_url):
    print(line.decode('utf-8')) #utf-8 or iso8859-1 or whatever the page encoding scheme is

38

私はPythonの初心者であり、受け入れられたソリューションでのPython 3に関する直接のコメントは混乱を招きました。後世のために、Python 3でこれを行うコードは

import urllib.request
data = urllib.request.urlopen(target_url)

for line in data:
    ...

または代わりに

from urllib.request import urlopen
data = urlopen(target_url)

import urllib動作しないことに注意してください。


24

行ごとに読む必要は本当にありません。次のようにすべてを取得できます。

import urllib
txt = urllib.urlopen(target_url).read()

2
動作しません:AttributeError:module 'urllib' has no attribute 'urlopen'
Iratzar Carrasson Bores

1
この回答はPython 2でのみ機能します。編集:Python 3 についてのAndrew Maoの回答をご覧ください
。– leafmeal

Python 3の場合:txt = urllib.request.urlopen(target_url).read()
区切り文字



6
import urllib2

f = urllib2.urlopen(target_url)
for l in f.readlines():
    print l

2
+1が、最も安全な方法ではなく、最も簡単な方法であることに注意してください。サーバー側でエラーが発生し、この1つの配信コンテンツが永遠に続くと、無限ループに陥る可能性があります。
e-satis

5

Python 3のもう1つの方法は、urllib3パッケージを使用することです

import urllib3

http = urllib3.PoolManager()
response = http.request('GET', target_url)
data = response.data.decode('utf-8')

これはurllib3が持っていることを誇っているので、urllibよりも良いオプションであるかもしれません

  • スレッドセーフ。
  • 接続プーリング。
  • クライアント側のSSL / TLS検証。
  • マルチパートエンコーディングによるファイルのアップロード。
  • リクエストを再試行し、HTTPリダイレクトを処理するためのヘルパー。
  • gzipおよびdeflateエンコーディングのサポート。
  • HTTPおよびSOCKSのプロキシサポート。
  • 100%テストカバレッジ。

2
リクエストのライブラリーは、一部urllib3に基づいています。
フロイド

実際、これは、これまでの最新バージョンのPythonに対して(urllibx)をインストールする上記の回答の唯一のものです。
AbstractAlgebraLearner

3

私にとっては、上記の回答はどれもすぐにはうまくいきませんでした。代わりに、私は次のことをしなければなりませんでした(Python 3):

from urllib.request import urlopen

data = urlopen("[your url goes here]").read().decode('utf-8')

# Do what you need to do with the data.

0

@ ken-kinderが提案したPython 2のソリューションをPython 3で機能するようにここで更新するだけです。

import urllib
urllib.request.urlopen(target_url).read()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.