2011-10-01 200 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'