Dato un URL a un file di testo, qual è il modo più semplice per leggere il contenuto del file di testo?


113

In Python, quando viene fornito l'URL di un file di testo, qual è il modo più semplice per accedere ai contenuti dal file di testo e stampare il contenuto del file localmente riga per riga senza salvare una copia locale del file di testo?

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

Risposte:


114

Modifica 09/2016: in Python 3 e versioni successive utilizzare urllib.request invece di urllib2

In realtà il modo più semplice è:

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

Non hai nemmeno bisogno di "readlines", come suggerito da Will. Potresti anche accorciarlo a: *

import urllib2

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

Ma ricorda in Python, la leggibilità è importante.

Tuttavia, questo è il modo più semplice ma non sicuro perché la maggior parte delle volte con la programmazione di rete, non si sa se la quantità di dati da aspettarsi verrà rispettata. Quindi in genere è meglio leggere una quantità di dati fissa e ragionevole, qualcosa che sai essere sufficiente per i dati che ti aspetti ma che impedirà che il tuo script venga inondato:

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

* Secondo esempio in 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

Sono un principiante di Python e il commento disinvolto su Python 3 nella soluzione accettata era fonte di confusione. Per i posteri, il codice per farlo in Python 3 è

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

for line in data:
    ...

o in alternativa

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

Nota che semplicemente import urllibnon funziona.


24

Non c'è davvero bisogno di leggere riga per riga. Puoi ottenere il tutto in questo modo:

import urllib
txt = urllib.urlopen(target_url).read()

2
Non funziona: AttributeError: il modulo 'urllib' non ha l'attributo 'urlopen'
Iratzar Carrasson Bores,

1
Questa risposta funziona solo in Python 2. EDIT: vedi la risposta di Andrew Mao per Python 3.
leafmeal

Per Python 3 sarebbe: txt = urllib.request.urlopen (target_url) .read ()
delimitatore

22

La libreria delle richieste ha un'interfaccia più semplice e funziona sia con Python 2 che con 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

6
import urllib2

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

2
+1, ma tieni presente che è il modo più semplice, NON IL PIÙ SICURO. Se si verifica un errore sul lato server e questo contenuto consegna per sempre, potresti finire con un ciclo infinito.
e-satis

5

Un altro modo in Python 3 è usare il pacchetto urllib3 .

import urllib3

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

Questa può essere un'opzione migliore di urllib poiché urllib3 vanta di avere

  • Sicurezza del filo.
  • Pool di connessioni.
  • Verifica SSL / TLS lato client.
  • Caricamenti di file con codifica multiparte.
  • Helper per ritentare le richieste e gestire i reindirizzamenti HTTP.
  • Supporto per gzip e deflate codifica.
  • Supporto proxy per HTTP e SOCKS.
  • Copertura del test al 100%.

2
La libreria delle richieste è in parte basata su urllib3.
floydn

In realtà questa è l'unica delle risposte precedenti che installerà (urllibx) per l'ultima versione di Python fino ad oggi.
AbstractAlgebraLearner

3

Per me, nessuna delle risposte di cui sopra ha funzionato direttamente. Invece, ho dovuto fare quanto segue (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

Sto solo aggiornando qui la soluzione suggerita da @ ken-kinder affinché Python 2 funzioni per Python 3:

import urllib
urllib.request.urlopen(target_url).read()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.