Dada una URL a un archivo de texto, ¿cuál es la forma más sencilla de leer el contenido del archivo de texto?

113

En Python, cuando se le da la URL de un archivo de texto, ¿cuál es la forma más sencilla de acceder al contenido del archivo de texto e imprimir el contenido del archivo de forma local línea por línea sin guardar una copia local del archivo de texto?

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

Respuestas:

114

Edición 09/2016: en Python 3 y versiones posteriores, use urllib.request en lugar de urllib2

En realidad, la forma más sencilla es:

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

Ni siquiera necesitas "readlines", como sugirió Will. Incluso podría acortarlo a: *

import urllib2

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

Pero recuerde que en Python, la legibilidad es importante.

Sin embargo, esta es la forma más sencilla pero no segura porque la mayoría de las veces con la programación de red, no se sabe si se respetará la cantidad de datos esperada. Entonces, en general, es mejor que lea una cantidad fija y razonable de datos, algo que sepa que es suficiente para los datos que espera, pero que evitará que su script se inunde:

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 ejemplo en 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
fuente
38

Soy un novato en Python y el comentario casual sobre Python 3 en la solución aceptada fue confuso. Para la posteridad, el código para hacer esto en Python 3 es

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

for line in data:
    ...

o alternativamente

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

Tenga en cuenta que simplemente import urllibno funciona.

Andrew Mao
fuente
24

Realmente no hay necesidad de leer línea por línea. Puede obtener todo así:

import urllib
txt = urllib.urlopen(target_url).read()
Ken Kinder
fuente
2
No funciona: AttributeError: el módulo 'urllib' no tiene el atributo 'urlopen'
Iratzar Carrasson Bores
1
Esta respuesta solo funciona en Python 2. EDITAR: vea la respuesta de Andrew Mao para Python 3.
harina de hojas
Para Python 3 sería: txt = urllib.request.urlopen (target_url) .read ()
delimitador
22

La biblioteca de solicitudes tiene una interfaz más simple y funciona con Python 2 y 3.

import requests

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

f = urllib2.urlopen(target_url)
for l in f.readlines():
    print l
Será
fuente
2
+1, pero tenga en cuenta que es la forma más sencilla, NO LA MÁS SEGURA. Si ocurre algún error en el lado del servidor y este contenido de entrega para siempre, podría terminar con un bucle infinito.
e-satis
5

Otra forma en Python 3 es usar el paquete urllib3 .

import urllib3

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

Esta puede ser una mejor opción que urllib ya que urllib3 se jacta de tener

  • Seguridad del hilo.
  • Agrupación de conexiones.
  • Verificación SSL / TLS del lado del cliente.
  • Carga de archivos con codificación multiparte.
  • Ayudantes para reintentar solicitudes y lidiar con redireccionamientos HTTP.
  • Soporte para codificación gzip y deflate.
  • Soporte de proxy para HTTP y SOCKS.
  • Cobertura de prueba del 100%.
harina de hojas
fuente
2
La biblioteca de solicitudes se basa en parte en urllib3.
Floydn
En realidad, esta es la única de las respuestas anteriores que se instalará (urllibx) para la última versión de Python hasta la fecha.
AbstractAlgebraLearner
3

Para mí, ninguna de las respuestas anteriores funcionó directamente. En cambio, tuve que hacer lo siguiente (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
fuente
0

Solo actualizo aquí la solución sugerida por @ ken-kinder para que Python 2 funcione para Python 3:

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