Враховуючи 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 і новіших версіях використовуйте urllib.request замість urllib2

Насправді найпростіший спосіб:

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

Вам навіть не потрібні "читальні лінії", як запропонував Вілл. Ви можете навіть скоротити його до: *

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:

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: модуль 'urllib' не має атрибута 'urlopen'
Iratzar Carrasson Bores

1
Ця відповідь працює лише в Python 2. EDIT: дивіться відповідь Ендрю Мао за Python 3.
листкове борошно

Для 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, але зауважте, що це найпростіший спосіб, а не найбезпечніший. Якщо будь-яка помилка виникає на стороні сервера і цей вміст однієї доставки назавжди, ви можете закінчитись нескінченним циклом.
e-satis

5

Ще один спосіб в Python 3 - використовувати пакет urllib3 .

import urllib3

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

Це може бути кращим варіантом, ніж urllib, оскільки urllib3 може похвалитися тим, що має

  • Безпека нитки.
  • Об'єднання з'єднань.
  • Підтвердження SSL / TLS на стороні клієнта.
  • Завантаження файлів з багаточастинковим кодуванням.
  • Помічники для повторного запиту та обробки переадресацій HTTP.
  • Підтримка кодування gzip та deflate.
  • Підтримка проксі для HTTP та SOCKS.
  • 100% охоплення тестом.

2
Бібліотека запитів частково базується на urllib3.
floydn

Насправді це єдиний з вищезазначених відповідей, який встановить (urllibx) для останньої на сьогоднішній день версії Python.
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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.