2010-04-16 50 views
2

PdfFileReader讀取PDF文件的內容,以創建一個對象。廉價的方式來添加尋求一個文件類型對象

我通過urllib.urlopen()查詢從CDN的PDF格式,這提供了我喜歡的對象,它沒有尋求一個文件。 PdfFileReader,然而使用seek。

有什麼簡單的方法來創建通過URL下載的PDF一個PdfFileReader對象。

現在,我能做些什麼來避免寫入磁盤,並通過file()再次閱讀。

在此先感謝。

+0

請注意,如果你*保存到磁盤並打開它,你可以使用'open'而不是'file'。 – 2010-04-16 13:03:29

+0

Mike:'PdfFileReader(file('aaa.pdf'))'確實很好。 – 2010-04-16 13:11:13

+0

是的,但最好在'file()'上使用'open()' - 它們採用相同的參數。請參閱http://docs.python.org/library/functions.html#file – Amber 2010-04-16 13:11:58

回答

1

是不是真的有便宜的,準備使用的方式做到這一點。最簡單的方法是讀取所有數據並將其放入StringIO對象中。但是,這確實需要你先閱讀所有內容,這可能是也可能不是你想要的。

如果你想要的東西,只讀取必要,然後存儲什麼閱讀(或者也許只是一個什麼閱讀部分),那麼你必須把它寫自己。對於某些示例,您可能希望看到StringIO模塊(或Python12.6中的io模塊)的源代碼。

+0

不,不,不,不是100 MB文件。我只想要一些有效的東西。如果可能的話,價格便宜。不通過編寫IO模塊。 :) – 2010-04-16 13:14:01

+0

所以使用第一個建議:StringIO是你的朋友。 – 2010-04-16 13:15:02

1

你可以使用.read()方法在文件的整個數據讀取,然後創建自己的文件對象(最有可能通過StringIO)提供對它的訪問。

+0

上的說明。我無法執行'file(urllib.urlopen('abc.pdf')。read())'。我得到「TypeError:file()參數1必須是沒有NULL字節的編碼字符串,不是str」 – 2010-04-16 13:08:26

+0

'file()'不是像'dict()'或'list()'這樣的轉換函數 - 它實際上需要相同的參數作爲'open()'(文件名,可選模式+緩衝區大小)。你不能只傳遞它的文件內容並獲得一個文件對象。 – Amber 2010-04-16 13:10:45

1

我懷疑你可能在這裏過早優化。

大多數現代系統都會將文件緩存到內存中一段時間​​,然後將它們刷新到磁盤,所以如果您將數據寫入臨時文件,請重新讀入,然後關閉並刪除您可能找到的文件沒有顯着的光盤流量(除非它真的是100MB)。

您可能想要看看如何使用tempfile.TemporaryFile()來創建臨時文件,該文件在關閉時會自動刪除,否則tempfile.SpooledTemporaryFile()會明確地將其全部保留在內存中,直到其超過特定大小。

相關問題