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

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

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.


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()

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

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

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.

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()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.