2015-05-25 233 views
2

我想打電話給a python function接受一個絕對路徑作爲參數,但我想引用該文件是在網絡上。裹URL作爲文件系統路徑

如果沒有在本地克隆文件,有沒有辦法讓我可以參考python 認爲這個文件是本地文件?

換句話說,我想換行的網址在一個變量my_file_path,並且有這樣的回報True

os.path.isfile(my_file_path) 

請注意,我需要假文件系統路徑,如計劃的其他呼叫我我使用的是期望的路徑,而不是類似文件的對象(這包括其他函數調用the function I linked

回答

2

一個非常好的方法是使用requests庫。您可以使用stream=True選項將get功能得到一個類似文件的對象:

r = requests.get('https://api.github.com/events', stream=True) 
loadmat(r.raw, ...) 

在需要的實際路徑的情況下,你可以使用tempfile模塊以及:

with tempfile.NamedTemporaryFile() as fd: 
    r = requests.get('https://api.github.com/events', stream=True) 

    for chunk in r.iter_content(chunk_size): 
     fd.write(chunk) 
    fd.flush() 

    loadmat(fd.name) 

# other code here, where the temp file no longer exists but the data has been read 
1

有沒有辦法讓Python在需要路徑的地方使用URL。

在很多情況下,就像你在問題中鏈接的功能一樣,它實際上需要一個類似文件的對象,並且由例如urlopen返回的對象類似於文件。但在其他情況下,這是行不通的。

那麼,你可以做什麼?

  1. 在Python級別以下,操作系統可能有辦法掛載不同類型的遠程路徑,就好像它們是本地文件系統的一部分一樣。
  2. 在更高層次上,編寫自己的包裝器,只將文件下載到臨時文件。該臨時文件當然會通過您想要的os.path.isfile(my_file_path)測試,並且可以處理需要文件的其他所有文件。但這意味着您需要保留代碼的兩個「層」 - 即想要處理URL的部分,以及需要處理僅能接收本地文件的函數的部分 - 並將它們之間的接口層。至少在某些平臺上,除非必要,否則您可以創建永不會刷新到磁盤的臨時文件。 (你甚至可以創建一個臨時文件,該文件不會出現在目錄樹的任何位置,但在這裏沒有任何幫助,因爲那樣你顯然無法傳遞路徑名......)所以你不是「克隆文件」在任何意義上,這實際上很重要