Bir metin dosyasının URL'si verildiğinde, metin dosyasının içeriğini okumanın en basit yolu nedir?


113

Python'da, bir metin dosyasının URL'si verildiğinde, metin dosyası dışındaki içeriğe erişmenin ve metin dosyasının yerel bir kopyasını kaydetmeden dosyanın içeriğini yerel olarak satır satır yazdırmanın en basit yolu nedir?

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

Yanıtlar:


114

09/2016 Düzenleme: Python 3 ve üzeri sürümlerde urllib2 yerine urllib.request kullanın

Aslında en basit yol şudur:

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

Will'in önerdiği gibi "satırlara" bile ihtiyacınız yok. Hatta kısaltabilirsiniz: *

import urllib2

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

Ancak Python'da okunabilirliğin önemli olduğunu unutmayın.

Bununla birlikte, bu en basit yoldur, ancak güvenli yol değildir, çünkü ağ programlamasında çoğu zaman, beklenecek veri miktarına saygı gösterilip gösterilmeyeceğini bilemezsiniz. Bu nedenle, genellikle sabit ve makul miktarda veriyi okumanız daha iyi olur, beklediğiniz veriler için yeterli olduğunu bildiğiniz ancak betiğinizin su basmasını önleyeceği bir şey:

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

* Python 3'teki ikinci örnek:

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

Python'a yeni başlayan biriyim ve kabul edilen çözümde Python 3 hakkında yapılan hazırlıksız yorum kafa karıştırıcıydı. Gelecek nesil için, Python 3'te bunu yapacak kod

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

for line in data:
    ...

Veya alternatif olarak

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

Sadece import urllibçalışmadığını unutmayın.


24

Satır satır okumaya gerçekten gerek yok. Her şeyi şu şekilde elde edebilirsiniz:

import urllib
txt = urllib.urlopen(target_url).read()

2
Çalışmıyor
Iratzar Carrasson Bores

1
Bu cevap yalnızca Python 2'de işe
yarar

Python 3 için şu olur: txt = urllib.request.urlopen (target_url) .read ()
sınırlayıcı


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, ancak bunun en güvenli yol değil, en basit yol olduğunu lütfen unutmayın. Sunucu tarafında herhangi bir hata oluşursa ve bu tek teslimat içeriği sonsuza kadar devam ederse, sonsuz bir döngü elde edebilirsiniz.
e-satis

5

Python 3'te başka bir yol da urllib3 paketini kullanmaktır .

import urllib3

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

Bu urllib'den daha iyi bir seçenek olabilir çünkü urllib3,

  • İplik güvenliği.
  • Bağlantı havuzu oluşturma.
  • İstemci tarafı SSL / TLS doğrulaması.
  • Çok parçalı kodlama ile dosya yüklemeleri.
  • İstekleri yeniden denemek ve HTTP yeniden yönlendirmeleriyle ilgilenmek için yardımcılar.
  • Gzip ve deflate kodlaması desteği.
  • HTTP ve SOCKS için proxy desteği.
  • % 100 test kapsamı.

2
İstekleri kütüphane kısmen urllib3 dayanmaktadır.
floydn

Aslında bu, Python'un bugüne kadarki en son sürümü için yükleyecek (urllibx) yukarıdaki yanıtlardan yalnızca biridir.
CebirselGeometriÖğrenci

3

Benim için yukarıdaki yanıtların hiçbiri doğrudan işe yaramadı. Bunun yerine aşağıdakileri yapmam gerekiyordu (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

Python 2'nin Python 3 ile çalışması için @ ken-kinder tarafından önerilen çözümü burada güncelliyoruz:

import urllib
urllib.request.urlopen(target_url).read()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.