Dado um URL para um arquivo de texto, qual é a maneira mais simples de ler o conteúdo do arquivo de texto?

113

Em Python, ao receber a URL de um arquivo de texto, qual é a maneira mais simples de acessar o conteúdo do arquivo de texto e imprimir o conteúdo do arquivo localmente, linha por linha, sem salvar uma cópia local do arquivo de texto?

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

Respostas:

114

Editar 09/2016: No Python 3 e superior, use urllib.request em vez de urllib2

Na verdade, a maneira mais simples é:

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

Você nem precisa de "linhas de leitura", como sugeriu Will. Você pode até encurtá-lo para: *

import urllib2

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

Mas lembre-se que em Python, a legibilidade é importante.

No entanto, esta é a maneira mais simples, mas não a maneira segura, porque na maioria das vezes com a programação de rede, você não sabe se a quantidade de dados esperada será respeitada. Então, geralmente é melhor você ler uma quantidade fixa e razoável de dados, algo que você sabe ser suficiente para os dados que você espera, mas evitará que seu script seja inundado:

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

* Segundo exemplo em 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
e-satis
fonte
38

Sou um novato em Python e o comentário improvisado sobre Python 3 na solução aceita foi confuso. Para a posteridade, o código para fazer isso no Python 3 é

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

for line in data:
    ...

ou alternativamente

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

Observe que simplesmente import urllibnão funciona.

Andrew Mao
fonte
24

Não há realmente necessidade de ler linha por linha. Você pode obter a coisa toda assim:

import urllib
txt = urllib.urlopen(target_url).read()
Ken Kinder
fonte
2
Não funciona: AttributeError: o módulo 'urllib' não tem o atributo 'urlopen'
Iratzar Carrasson Bores
1
Esta resposta só funciona em Python 2. EDITAR: veja a resposta de Andrew Mao para Python 3.
farinha de folhas
Para Python 3, seria: txt = urllib.request.urlopen (target_url) .read ()
delimitador
24

A biblioteca de solicitações tem uma interface mais simples e funciona com Python 2 e 3.

import requests

response = requests.get(target_url)
data = response.text
fubá
fonte
10
import urllib2
for line in urllib2.urlopen("http://www.myhost.com/SomeFile.txt"):
    print line
Fabian
fonte
6
import urllib2

f = urllib2.urlopen(target_url)
for l in f.readlines():
    print l
Vai
fonte
2
+1, mas observe que é a maneira mais simples, NÃO A MAIS SEGURA. Se ocorrer algum erro no lado do servidor e este entregar conteúdo para sempre, você pode acabar com um loop infinito.
e-satis
5

Outra maneira no Python 3 é usar o pacote urllib3 .

import urllib3

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

Esta pode ser uma opção melhor do que urllib, uma vez que urllib3 se orgulha de ter

  • Segurança da linha.
  • Pooling de conexão.
  • Verificação SSL / TLS do lado do cliente.
  • Uploads de arquivos com codificação multiparte.
  • Ajudantes para repetir solicitações e lidar com redirecionamentos HTTP.
  • Suporte para codificação gzip e deflate.
  • Suporte de proxy para HTTP e SOCKS.
  • 100% de cobertura de teste.
fubá
fonte
2
A biblioteca de solicitações é parcialmente baseada em urllib3.
floydn
Na verdade, esta é a única das respostas acima que será instalada (urllibx) para a versão mais recente do Python até o momento.
Aluno de Geometria Algébrica
3

Para mim, nenhuma das respostas acima funcionou diretamente. Em vez disso, tive que fazer o seguinte (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
fonte
0

Atualizando aqui a solução sugerida por @ ken-kinder para Python 2 funcionar para Python 3:

import urllib
urllib.request.urlopen(target_url).read()
delimitador
fonte