Was ist bei einer URL zu einer Textdatei der einfachste Weg, den Inhalt der Textdatei zu lesen?

112

Was ist in Python, wenn die URL für eine Textdatei angegeben wird, der einfachste Weg, auf den Inhalt der Textdatei zuzugreifen und den Inhalt der Datei lokal zeilenweise auszudrucken, ohne eine lokale Kopie der Textdatei zu speichern?

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

Antworten:

113

Edit 09/2016: Verwenden Sie in Python 3 und höher urllib.request anstelle von urllib2

Eigentlich ist der einfachste Weg:

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

Sie brauchen nicht einmal "Readlines", wie Will vorgeschlagen hat. Sie können es sogar verkürzen auf: *

import urllib2

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

Denken Sie jedoch daran, dass in Python die Lesbarkeit wichtig ist.

Dies ist jedoch der einfachste, aber nicht der sichere Weg, da Sie bei der Netzwerkprogrammierung meistens nicht wissen, ob die zu erwartende Datenmenge eingehalten wird. Sie sollten also im Allgemeinen eine feste und angemessene Datenmenge lesen, von der Sie wissen, dass sie für die erwarteten Daten ausreicht, aber verhindert, dass Ihr Skript überflutet wird:

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

* Zweites Beispiel 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
e-satis
quelle
38

Ich bin ein Neuling in Python und der spontane Kommentar zu Python 3 in der akzeptierten Lösung war verwirrend. Für die Nachwelt lautet der Code dafür in Python 3

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

for line in data:
    ...

oder alternativ

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

Beachten Sie, dass dies einfach import urllibnicht funktioniert.

Andrew Mao
quelle
24

Es ist wirklich nicht nötig, Zeile für Zeile zu lesen. Sie können das Ganze so bekommen:

import urllib
txt = urllib.urlopen(target_url).read()
Ken Kinder
quelle
2
Es funktioniert nicht: AttributeError: Modul 'urllib' hat kein Attribut 'urlopen'
Iratzar Carrasson Bores
1
Diese Antwort funktioniert nur in Python 2. BEARBEITEN: Siehe Andrew Maos Antwort für Python 3.
Blattmehl
Für Python 3 wäre es: txt = urllib.request.urlopen (target_url) .read ()
Trennzeichen
21

Die Anforderungsbibliothek hat eine einfachere Oberfläche und funktioniert sowohl mit Python 2 als auch mit Python 3.

import requests

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

f = urllib2.urlopen(target_url)
for l in f.readlines():
    print l
Wille
quelle
2
+1, aber bitte beachten Sie, dass dies der einfachste Weg ist, NICHT DER SICHERSTE. Wenn auf der Serverseite ein Fehler auftritt und dieser eine Übermittlungsinhalt für immer, kann dies zu einer Endlosschleife führen.
E-Satis
5

Eine andere Möglichkeit in Python 3 ist die Verwendung des urllib3-Pakets .

import urllib3

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

Dies kann eine bessere Option sein als urllib, da urllib3 sich rühmt

  • Gewindesicherheit.
  • Verbindungspooling.
  • Clientseitige SSL / TLS-Überprüfung.
  • Datei-Uploads mit mehrteiliger Codierung.
  • Helfer zum Wiederholen von Anforderungen und zum Behandeln von HTTP-Weiterleitungen.
  • Unterstützung für gzip- und deflate-Codierung.
  • Proxy-Unterstützung für HTTP und SOCKS.
  • 100% Testabdeckung.
Blattmehl
quelle
2
Die Anforderungsbibliothek basiert teilweise auf urllib3.
Floydn
Tatsächlich ist dies die einzige der oben genannten Antworten, die für die neueste Version von Python (urllibx) installiert wird.
AbstractAlgebraLearner
2

Für mich hat keine der oben genannten Antworten direkt funktioniert. Stattdessen musste ich Folgendes tun (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
quelle
0

Aktualisieren Sie einfach die von @ ken-kinder für Python 2 vorgeschlagene Lösung, um für Python 3 zu funktionieren:

import urllib
urllib.request.urlopen(target_url).read()
Trennzeichen
quelle