给定一个文本文件的URL,最简单的读取文本文件内容的方法是什么?


113

在Python中,当获得文本文件的URL时,最简单的方法是从文本文件访问内容并逐行将文件内容打印出本地而不保存文本文件的本地副本?

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

Answers:


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

正如Will所建议的,您甚至不需要“ readlines”。您甚至可以将其缩短为: *

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的:模块“的urllib”有没有属性“的urlopen”
Iratzar Carrasson伯利斯

1
此答案仅在Python 2中有效。编辑:请参见Andrew Mao对Python 3 的答案
。– leafmeal

对于Python 3,它将是:txt = urllib.request.urlopen(target_url).read()
定界符

22

请求库有一个简单的界面,并与两个Python 2和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,但请注意,这是最简单的方法,而不是最安全的方法。如果服务器端发生任何错误,并且这种交付内容永远存在,那么您可能会陷入无限循环。
e-satis

5

Python 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

实际上,这是上述答案中仅有的一个,它将为最新版本的Python安装(urllibx)。
AbstractAlgebraLearner

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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.