É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
Chris
la source

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
e-satis
la source
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.

Andrew Mao
la source
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()
Ken Kinder
la source
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
24

La bibliothèque de requêtes a une interface plus simple et fonctionne avec Python 2 et 3.

import requests

response = requests.get(target_url)
data = response.text
farine de feuilles
la source
10
import urllib2
for line in urllib2.urlopen("http://www.myhost.com/SomeFile.txt"):
    print line
Fabien
la source
6
import urllib2

f = urllib2.urlopen(target_url)
for l in f.readlines():
    print l
Volonté
la source
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%.
farine de feuilles
la source
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.
bmiselis
la source
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()
délimiteur
la source