Étant donné une URL vers un fichier texte, quelle est la manière la plus simple de lire le contenu du fichier texte?


113

En Python, lorsqu'on lui donne l'URL d'un fichier texte, quel est le moyen le plus simple d'accéder au contenu du fichier texte et d'imprimer le contenu du fichier localement ligne par ligne sans enregistrer une copie locale du fichier texte?

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

Réponses:


114

Edit 09/2016: Dans Python 3 et plus, utilisez urllib.request au lieu de urllib2

En fait, le moyen le plus simple est:

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

Vous n'avez même pas besoin de "readlines", comme Will l'a suggéré. Vous pouvez même le raccourcir en: *

import urllib2

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

Mais rappelez-vous qu'en Python, la lisibilité est importante.

Cependant, c'est le moyen le plus simple mais pas le plus sûr car la plupart du temps avec la programmation réseau, vous ne savez pas si la quantité de données à attendre sera respectée. Donc, vous feriez généralement mieux de lire une quantité fixe et raisonnable de données, ce que vous savez être suffisant pour les données que vous attendez mais qui empêchera votre script d'être inondé:

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

* Deuxième exemple 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

Je suis un novice en Python et le commentaire désinvolte sur Python 3 dans la solution acceptée était déroutant. Pour la postérité, le code pour faire cela dans Python 3 est

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

for line in data:
    ...

Ou bien

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

Notez que import urllibcela ne fonctionne tout simplement pas.


24

Il n'est vraiment pas nécessaire de lire ligne par ligne. Vous pouvez obtenir le tout comme ceci:

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

2
Cela ne fonctionne pas: AttributeError: le module 'urllib' n'a pas d'attribut 'urlopen'
Iratzar Carrasson Bores

1
Cette réponse ne fonctionne qu'en Python 2. EDIT: voir la réponse d'Andrew Mao pour Python 3.
leafmeal

Pour Python 3, ce serait: txt = urllib.request.urlopen (target_url) .read ()
délimiteur


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, mais veuillez noter que c'est le moyen le plus simple, PAS LE PLUS SÛR. Si une erreur se produit du côté du serveur et de ce contenu de diffusion pour toujours, vous pourriez vous retrouver avec une boucle infinie.
e-satis

5

Une autre façon de Python 3 consiste à utiliser le package urllib3 .

import urllib3

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

Cela peut être une meilleure option que urllib car urllib3 se vante d'avoir

  • Sécurité du fil.
  • Mise en commun des connexions.
  • Vérification SSL / TLS côté client.
  • Téléchargements de fichiers avec encodage en plusieurs parties.
  • Helpers pour réessayer les requêtes et traiter les redirections HTTP.
  • Prise en charge de l'encodage gzip et deflate.
  • Prise en charge du proxy pour HTTP et SOCKS.
  • Couverture de test à 100%.

2
La bibliothèque de requêtes est en partie basée sur urllib3.
floydn le

En fait, c'est la seule des réponses ci-dessus qui installera (urllibx) pour la dernière version de Python à ce jour.
AlgebraicGeometryStudent

3

Pour moi, aucune des réponses ci-dessus n'a fonctionné directement. Au lieu de cela, j'ai dû faire ce qui suit (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

Il suffit de mettre à jour ici la solution suggérée par @ ken-kinder pour que Python 2 fonctionne pour Python 3:

import urllib
urllib.request.urlopen(target_url).read()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.