เมื่อกำหนด URL ให้กับไฟล์ข้อความวิธีที่ง่ายที่สุดในการอ่านเนื้อหาของไฟล์ข้อความคืออะไร


113

ใน Python เมื่อกำหนด URL สำหรับไฟล์ข้อความวิธีที่ง่ายที่สุดในการเข้าถึงเนื้อหาจากไฟล์ข้อความและพิมพ์เนื้อหาของไฟล์ในเครื่องทีละบรรทัดโดยไม่บันทึกสำเนาภายในของไฟล์ข้อความคืออะไร

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

คำตอบ:


114

แก้ไข 09/2016: ใน Python 3 ขึ้นไปให้ใช้urllib.requestแทน urllib2

จริงๆแล้ววิธีที่ง่ายที่สุดคือ:

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

คุณไม่จำเป็นต้องมี "readlines" ตามที่ Will แนะนำ คุณสามารถย่อให้สั้นลงเป็น: *

import urllib2

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

แต่จำไว้ใน Python ความสามารถในการอ่านเป็นเรื่องสำคัญ

อย่างไรก็ตามนี่เป็นวิธีที่ง่ายที่สุด แต่ไม่ใช่วิธีที่ปลอดภัยเนื่องจากเวลาส่วนใหญ่ในการเขียนโปรแกรมเครือข่ายคุณจะไม่รู้ว่าปริมาณข้อมูลที่คาดหวังจะได้รับการเคารพหรือไม่ ดังนั้นโดยทั่วไปคุณควรอ่านข้อมูลในปริมาณที่คงที่และสมเหตุสมผลสิ่งที่คุณรู้ว่าเพียงพอสำหรับข้อมูลที่คุณคาดหวัง แต่จะป้องกันไม่ให้สคริปต์ของคุณท่วม:

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:

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 และความคิดเห็นเกี่ยวกับPython 3ในโซลูชันที่ยอมรับนั้นสับสน สำหรับรุ่นหลังรหัสที่ต้องทำใน Python 3 คือ

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

for line in data:
    ...

หรืออีกทางหนึ่ง

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

โปรดทราบimport urllibว่าไม่ได้ผล


24

ไม่จำเป็นต้องอ่านทีละบรรทัด คุณจะได้รับสิ่งนี้ทั้งหมด:

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

2
มันไม่ทำงาน: AttributeError: module 'urllib' ไม่มีแอตทริบิวต์ 'urlopen'
Iratzar Carrasson Bores

1
คำตอบนี้ใช้ได้เฉพาะใน Python 2 เท่านั้นแก้ไข: ดูคำตอบของ Andrew Maoสำหรับ Python 3
leafmeal

สำหรับ Python 3 จะเป็น: txt = urllib.request.urlopen (target_url) .read ()
ตัวคั่น



6
import urllib2

f = urllib2.urlopen(target_url)
for l in f.readlines():
    print l

2
+1 แต่โปรดทราบว่าเป็นวิธีที่ง่ายที่สุดไม่ใช่วิธีที่ปลอดภัยที่สุด หากข้อผิดพลาดใด ๆ เกิดขึ้นที่ฝั่งเซิร์ฟเวอร์และการส่งมอบเนื้อหานี้ตลอดไปคุณอาจจบลงด้วยการวนซ้ำที่ไม่สิ้นสุด
e-satis

5

วิธีการในการหลาม 3 ก็คือการใช้แพคเกจ urllib3

import urllib3

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

นี่อาจเป็นตัวเลือกที่ดีกว่า urllib เนื่องจาก urllib3 มี

  • ความปลอดภัยของด้าย
  • การรวมการเชื่อมต่อ
  • การตรวจสอบ SSL / TLS ฝั่งไคลเอ็นต์
  • อัปโหลดไฟล์ด้วยการเข้ารหัสหลายส่วน
  • ตัวช่วยสำหรับการลองคำขออีกครั้งและจัดการกับการเปลี่ยนเส้นทาง HTTP
  • รองรับการเข้ารหัส gzip และ deflate
  • รองรับพร็อกซีสำหรับ HTTP และ SOCKS
  • ครอบคลุมการทดสอบ 100%

2
ร้องขอห้องสมุดส่วนหนึ่งขึ้นอยู่ urllib3
floydn

อันที่จริงนี่เป็นคำตอบเดียวข้างต้นที่จะติดตั้ง (urllibx) สำหรับ Python เวอร์ชันล่าสุดจนถึงปัจจุบัน
AlgebraicGeometryStudent

3

สำหรับฉันคำตอบข้างต้นไม่ได้ผลตรงไปตรงมา แต่ฉันต้องทำสิ่งต่อไปนี้แทน (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

เพียงอัปเดตโซลูชันที่นี่แนะนำโดย @ ken-Kinder เพื่อให้ Python 2 ทำงานกับ Python 3:

import urllib
urllib.request.urlopen(target_url).read()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.