2017-02-17 16 views
9

這是寫的一個概括這個問題的所有文件:Way to extract pickles coming in and out of ipython/jupyter notebook確定讀入並從IPython的筆記本

在最高層次上,我正在尋找一種方式來自動地總結一下在IPython的筆記本電腦繼續。我認爲簡化問題的一種方式是將筆記本內部的所有數據操作視爲黑盒,並只關注其輸入和輸出。那麼,有沒有一種方法給ipython筆記本提供文件路徑,您如何輕鬆確定它讀入內存的所有不同文件/網站,以及隨後寫入/轉儲的所有文件?我想也許有可能是掃描文件,分析它的輸入和輸出的功能,並將其保存到一個字典爲方便:

summary_dict = summerize_file_io(ipynb_filepath) 

print summary_dict["inputs"] 
> ["../Resources/Data/company_orders.csv", "http://special_company.com/company_financials.csv" ] 

print summary_dict["outputs"] 
> ["orders_histogram.jpg","data_consolidated.pickle"] 

我不知道如何做到這一點很容易不僅僅是pickle對象包含不同的格式,如:txt,csv,jpg,png等等,也可能涉及直接從網絡讀取數據到筆記本本身。

+0

你可以使用蒔蘿醃整個Python交互式會話:http://trac.mystic.cacr.caltech.edu/project/pathos/wiki/dill.html – denfromufa

+0

@denfromufa也許我錯過了一些東西......怎麼會這有助於解釋筆記本中發生了什麼? – Afflatus

+0

如果沒有實際執行筆記本,您可能無法做到這一點。您可以像http://stackoverflow.com/a/2023709/464289中一樣替換__builtin__.open,並且如果使用相同的函數下載文件,則可以使用記錄您所需內容的調用替換該函數,然後下載文件。 – JRG

回答

4

您可以通過將內置open修補爲JRG suggested來檢查已打開或修改了哪些文件,如果您想跟蹤該功能,則應該擴展此功能以修補用於連接到網站的所有功能。

import builtins 


modified = {} 
old_open = builtins.open 


def new_open(name, mode='r', *args, **kwargs): 
    modified[name] = mode 
    return old_open(name, mode=mode, *args, **kwargs) 


# patch builtin open 
builtins.open = new_open 


# check modified 
def whats_modified(): 
    print('Session has opened/modified the following files:') 
    for name in sorted(modified): 
     mode = modified[name] 
     print(mode.ljust(8) + name) 

它我們在解釋執行這個(或使用它作爲一個模塊),我們可以看到我們已經修改了,我們怎麼把它打開。

In [4]: with open('ex.txt') as file: 
    ...:  print('ex.txt:', file.read()) 
    ...:  
ex.txt: some text. 



In [5]: with open('other.txt', 'w') as file: 
    ...:  file.write('Other text.\n') 
    ...:  

In [6]: whats_modified() 
Session has opened/modified the following files: 
r  ex.txt 
w  other.txt 

這有點雖然限制,因爲當一個文件被重新打開模式將被覆蓋,但可以被固定在new_open執行一些額外的檢查。