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

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

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.




10
import urllib2
for line in urllib2.urlopen("http://www.myhost.com/SomeFile.txt"):
    print line

6
import urllib2

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

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%.

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.

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()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.