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

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

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.


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

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


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

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.

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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.