Mając adres URL do pliku tekstowego, jaki jest najprostszy sposób odczytania zawartości pliku tekstowego?

113

W Pythonie, mając adres URL pliku tekstowego, jaki jest najprostszy sposób uzyskania dostępu do zawartości pliku tekstowego i wydrukowania zawartości pliku lokalnie wiersz po wierszu bez zapisywania lokalnej kopii pliku tekstowego?

TargetURL=http://www.myhost.com/SomeFile.txt
#read the file
#print first line
#print second line
#etc
Chris
źródło

Odpowiedzi:

114

Edycja 09/2016: W Pythonie 3 i nowszych użyj urllib.request zamiast urllib2

Właściwie najprostszy sposób to:

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

Nie potrzebujesz nawet „readlines”, jak zasugerował Will. Możesz go nawet skrócić do: *

import urllib2

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

Pamiętaj jednak, że w Pythonie liczy się czytelność.

Jest to jednak najprostszy sposób, ale nie bezpieczny, ponieważ przez większość czasu przy programowaniu sieciowym nie wiadomo, czy ilość danych, których można się spodziewać, zostanie uwzględniona. Więc ogólnie lepiej czytać stałą i rozsądną ilość danych, coś, co wiesz, że wystarczy dla danych, których oczekujesz, ale zapobiegnie zalaniu skryptu:

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

* Drugi przykład w Pythonie 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
źródło
38

Jestem nowicjuszem w Pythonie i odręczny komentarz na temat Pythona 3 w przyjętym rozwiązaniu był mylący. Dla potomnych kod w Pythonie 3 to

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

for line in data:
    ...

lub alternatywnie

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

Zauważ, że po prostu import urllibnie działa.

Andrew Mao
źródło
24

Naprawdę nie ma potrzeby czytać wiersz po wierszu. Całość można dostać w ten sposób:

import urllib
txt = urllib.urlopen(target_url).read()
Ken Kinder
źródło
2
To nie działa: AttributeError: moduł 'urllib' nie ma atrybutu 'urlopen'
Iratzar Carrasson Bores
1
Ta odpowiedź działa tylko w Pythonie 2. EDYCJA: zobacz odpowiedź Andrew Mao na Python 3.
leafmeal
Dla Pythona 3 byłoby to: txt = urllib.request.urlopen (target_url) .read ()
separator
24

Biblioteka wnioski ma prostszy interfejs i działa zarówno Python 2 i 3.

import requests

response = requests.get(target_url)
data = response.text
mączka liściasta
źródło
10
import urllib2
for line in urllib2.urlopen("http://www.myhost.com/SomeFile.txt"):
    print line
fabiański
źródło
6
import urllib2

f = urllib2.urlopen(target_url)
for l in f.readlines():
    print l
Będzie
źródło
2
+1, ale pamiętaj, że to najprostszy sposób, a NIE NAJBEZPIECZNY. Jeśli po stronie serwera wystąpi jakikolwiek błąd, a ta jedna zawartość będzie dostarczana na zawsze, możesz skończyć z nieskończoną pętlą.
e-satis
5

Innym sposobem w Pythonie 3 jest użycie pakietu urllib3 .

import urllib3

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

Może to być lepsza opcja niż urllib, ponieważ urllib3 chwali się posiadaniem

  • Bezpieczeństwo nici.
  • Pule połączeń.
  • Weryfikacja SSL / TLS po stronie klienta.
  • Przesyłanie plików z kodowaniem wieloczęściowym.
  • Pomocnicy do ponawiania żądań i obsługi przekierowań HTTP.
  • Obsługa kodowania gzip i deflate.
  • Wsparcie proxy dla HTTP i SOCKS.
  • 100% pokrycia testami.
mączka liściasta
źródło
2
Wnioski biblioteka jest częściowo oparty na urllib3.
floydn
Właściwie jest to jedyna z powyższych odpowiedzi, która zainstaluje (urllibx) dla najnowszej wersji Pythona.
AlgebraicGeometryStudent
3

Dla mnie żadna z powyższych odpowiedzi nie działała od razu. Zamiast tego musiałem wykonać następujące czynności (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
źródło
0

Aktualizuję tutaj rozwiązanie sugerowane przez @ ken-kinder, aby Python 2 działał z Pythonem 3:

import urllib
urllib.request.urlopen(target_url).read()
ogranicznik
źródło