2011-10-01 118 views
0

昨天我问了一个类似的问题,但我收录了一些代码,这些代码基本上以我想要的不同切线方式提出了我的问题。所以我会再试一次。从网站打开文件

我正在重写一个抓取网站以查找几百个文本文件的python脚本,我对该文件第二行之外的任何文本文件内容没有兴趣。以前我会下载所有文件,然后循环遍历它们以提取第二行。我现在想在我的脚本发现它时打开每个文件,抓住第二行,并关闭它,而不下载到我的硬盘,然后打开它。

因此,基本上有一种方法可以打开www.example.com/123456.txt中的文件,并将该文件的第二行复制到数组或其他东西,而无需下载并打开它。

+0

不,我是知道的,文件打开到内存中,然后将其丢弃听起来是正确的 – jimstandard

+2

由于'urlopen'返回像文件一样的对象,你可以简单地使用'readline'两次,这可能会避免下载整个文件(取决于缓冲)。无论如何,可能会节省一些大文件传输。 –

回答

2

那么,你可以使用urllib2.urlopen()来获取文件内容到内存中,提取第二行,然后立即从内存中丢弃文件,如果你想要的话,没有击中你的磁盘。

不得不通过互联网下载内容。

1

你可以尝试像urllib2.urlopen('url').read().splitlines()[1],但我想这将整个文件下载到内存

+0

“urlopen”对象不支持'readline()'吗? – agf

1

无法检索拳头N行(或执行线搜索),但如果Web服务器支持Range头您可以检索文件的前N个字节(字节搜索)。

如果你知道一个线的最大长度,你可以这样做:

>>> import urllib2 
>>> maxlinelength = 127 # nb: in terms of bytes 
>>> myHeaders = {'Range':'bytes=0-'+str(maxlinelength)} # from byte 0 to maxlinelength 
>>> req = urllib2.Request('http://www.constitution.org/gr/pericles_funeral_oration.txt', headers=myHeaders) 
>>> partial = urllib2.urlopen(req) 
>>> partial.readline() # first line discarded 
>>> yourvar = partial.readline() 
>>> yourvar # this is the second line: 
'from Thucydides (c.460/455-399 BCE), \r\r\n'