Cho một URL đến một tệp văn bản, cách đơn giản nhất để đọc nội dung của tệp văn bản là gì?


113

Trong Python, khi được cung cấp URL cho tệp văn bản, cách đơn giản nhất để truy cập nội dung từ tệp văn bản và in nội dung của tệp ra từng dòng cục bộ mà không lưu bản sao cục bộ của tệp văn bản là gì?

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

Câu trả lời:


114

Chỉnh sửa 09/2016: Trong Python 3 trở lên, hãy sử dụng urllib.request thay vì urllib2

Thực ra cách đơn giản nhất là:

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

Bạn thậm chí không cần "đường đọc", như Will đề xuất. Bạn thậm chí có thể rút ngắn nó thành: *

import urllib2

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

Nhưng hãy nhớ trong Python, khả năng đọc rất quan trọng.

Tuy nhiên, đây là cách đơn giản nhất nhưng không phải là cách an toàn vì hầu hết khi lập trình mạng, bạn không biết liệu lượng dữ liệu mong đợi có được tôn trọng hay không. Vì vậy, tốt hơn hết bạn nên đọc một lượng dữ liệu cố định và hợp lý, điều gì đó bạn biết là đủ cho dữ liệu bạn mong đợi nhưng sẽ ngăn tập lệnh của bạn không bị ngập:

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

* Ví dụ thứ hai trong 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

Tôi là một người mới làm quen với Python và nhận xét trực tiếp về Python 3 trong giải pháp được chấp nhận thật khó hiểu. Đối với hậu thế, mã để thực hiện điều này trong Python 3 là

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

for line in data:
    ...

Hay cách khác

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

Lưu ý rằng chỉ import urllibkhông hoạt động.


24

Thực sự không cần phải đọc từng dòng một. Bạn có thể nhận được toàn bộ điều như sau:

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

2
Nó không hoạt động: AttributeError: module 'urllib' không có thuộc tính 'urlopen'
Iratzar Carrasson Bores

1
Câu trả lời này chỉ hoạt động trong Python 2. CHỈNH SỬA: xem câu trả lời của Andrew Mao cho Python 3.
leafmeal

Đối với Python 3, nó sẽ là: txt = urllib.request.urlopen (target_url) .read ()
delimiter

22

Các thư viện yêu cầu có một giao diện đơn giản và làm việc với cả hai Python 2 và 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, nhưng xin lưu ý rằng đó là cách đơn giản nhất, KHÔNG AN TOÀN NHẤT. Nếu bất kỳ lỗi nào xảy ra ở phía máy chủ và nội dung phân phối này mãi mãi, bạn có thể kết thúc với một vòng lặp vô hạn.
e-thoả mãn

5

Một cách khác trong Python 3 là sử dụng gói urllib3 .

import urllib3

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

Đây có thể là một lựa chọn tốt hơn urllib vì urllib3 tự hào có

  • Chủ đề an toàn.
  • Kết nối gộp.
  • Xác minh SSL / TLS phía máy khách.
  • Tệp tải lên với mã hóa nhiều phần.
  • Người trợ giúp để thử lại các yêu cầu và xử lý các chuyển hướng HTTP.
  • Hỗ trợ mã hóa gzip và deflate.
  • Hỗ trợ proxy cho HTTP và SOCKS.
  • 100% bao phủ thử nghiệm.

2
Các yêu cầu thư viện một phần dựa trên urllib3.
floydn

Trên thực tế, đây là câu trả lời duy nhất ở trên sẽ cài đặt (urllibx) cho phiên bản Python mới nhất cho đến nay.
AbstractAlgebraLearner

3

Đối với tôi, không có câu trả lời nào ở trên có hiệu quả. Thay vào đó, tôi phải làm như sau (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

Chỉ cần cập nhật tại đây giải pháp do @ ken-kinder đề xuất cho Python 2 để hoạt động cho Python 3:

import urllib
urllib.request.urlopen(target_url).read()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.