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

时间:2009-09-08 10:56:08

标签: python

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

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

11 个答案:

答案 0 :(得分:94)

实际上最简单的方法是:

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”,正如威尔建议的那样。你甚至可以将它缩短为

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
  

编辑09/2016:在python 3及更高版本中使用urllib.request而不是urllib2

答案 1 :(得分:23)

实际上没有必要逐行阅读。你可以得到这样的全部内容:

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

答案 2 :(得分:19)

我是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不起作用。

答案 3 :(得分:10)

import urllib2
for line in urllib2.urlopen("http://www.myhost.com/SomeFile.txt"):
    print line

答案 4 :(得分:9)

requests library的界面更简单,可与Python 2和3一起使用。

import requests

response = requests.get(target_url)
data = response.text

答案 5 :(得分:6)

import urllib2

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

答案 6 :(得分: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.

答案 7 :(得分:3)

我确实认为 WITH BinaryVal AS( SELECT STRING_AGG(CASE V.I & POWER(2,P.I) WHEN 0 THEN 0 ELSE 1 END,'') WITHIN GROUP (ORDER BY P.I DESC) AS BinaryNum FROM (VALUES(SUBSTRING('5921000000b1212800b1219a',2,3)))SS(Hex) CROSS APPLY (VALUES(CONVERT(int,CONVERT(varbinary(2),'0x0'+SS.Hex,1))))V(I) CROSS APPLY (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11))P(I)) SELECT (SUM(CASE SUBSTRING(B1,P.I,1) WHEN 1 THEN POWER(2,P.P) END) * 2) - 128, (SUM(CASE SUBSTRING(B2,P.I,1) WHEN 1 THEN POWER(2,P.P) END) * 2) - 128 FROM BinaryVal BV CROSS APPLY(VALUES(SUBSTRING(BV.BinaryNum,1,6),SUBSTRING(BV.BinaryNum,7,6)))B(B1, B2) CROSS APPLY(VALUES(6,0),(5,1),(4,2),(3,3),(2,4),(1,5))P(I,P); 是最好的选择。另请注意手动设置编码的可能性。

requests

答案 8 :(得分:1)

Python 3中的另一种方法是使用http://flask.pocoo.org/docs/1.0/quickstart/#the-request-object

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%的测试覆盖率。
  •   

答案 9 :(得分:0)

只需在此处更新@ ken-kinder建议的Python 2解决方案即可在Python 3中使用

import urllib
urllib.request.urlopen(target_url).read()

答案 10 :(得分:0)

请求包对于简单的用户界面非常有效 正如@Andrew Mao所建议的

import requests
response = requests.get('http://lib.stat.cmu.edu/datasets/boston')
data = response.text
for i, line in enumerate(data.split('\n')):
    print(f'{i}   {line}')

o / p:

0    The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic
1    prices and the demand for clean air', J. Environ. Economics & Management,
2    vol.5, 81-102, 1978.   Used in Belsley, Kuh & Welsch, 'Regression diagnostics
3    ...', Wiley, 1980.   N.B. Various transformations are used in the table on
4    pages 244-261 of the latter.
5   
6    Variables in order:

how to extract dataset/dataframe from URL上结帐kaggle笔记本