Каков самый простой способ прочитать содержимое текстового файла с учетом 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'
Иратзар Каррассон Борес
1
Этот ответ работает только в Python 2. РЕДАКТИРОВАТЬ: см . Ответ Эндрю Мао для Python 3.
leafmeal
Для Python 3 это будет: txt = urllib.request.urlopen (target_url) .read ()
разделитель
24

Библиотека запросов имеет более простой интерфейс и работает как с Python 2, так и с Python 3.

import requests

response = requests.get(target_url)
data = response.text
листовая мука
источник
10
import urllib2
for line in urllib2.urlopen("http://www.myhost.com/SomeFile.txt"):
    print line
Fabian
источник
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.
AlgebraicGeometryStudent
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.
bmiselis
источник
0

Просто обновите здесь решение, предложенное @ ken-kinder для Python 2, чтобы работать на Python 3:

import urllib
urllib.request.urlopen(target_url).read()
ограничитель
источник